hasn't registered yet.
* 'ari set debug' now displays requests and responses as well as events.
-
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.12.0 to Asterisk 13.13.0 ----------
------------------------------------------------------------------------------
------------------
* New CLI commands have been added: "pjsip show identif(y|ies)", which lists
all configured PJSIP identify objects
-
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 12 to Asterisk 13 --------------------
------------------------------------------------------------------------------
* AMI action PJSIPNotify may now send to a URI instead of only to a PJSIP
endpoint as long as a default outbound endpoint is set. This also applies
to the equivalent CLI command (pjsip send notify)
-
+
* The AMI action PJSIPShowEndpoint now includes ContactStatusDetail sections
that give information on Asterisk's attempts to qualify the endpoint.
ALL_C_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.c,%,$(wildcard $(p)_*.c)))
ALL_CC_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.cc,%,$(wildcard $(p)_*.cc)))
endif
-
+
C_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_C_MODS))
CC_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_CC_MODS))
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile rules
#
# Copyright (C) 2006-2010, Digium, Inc.
ECHO_PREFIX=@
CMD_PREFIX=@
else
- ECHO_PREFIX=@\#
+ ECHO_PREFIX=@\#
CMD_PREFIX=
endif
distribution of Asterisk.
Even though Asterisk is released as open source under the terms of the
-GPLv2 (see LICENSE for details), no core functionality in Asterisk has any
+GPLv2 (see LICENSE for details), no core functionality in Asterisk has any
dependencies on libraries that are licensed under the GPL. One reason a module
may be in the add-ons category is that it may have a GPL dependency. Since
these dependencies are not compatible with dual licensing of Asterisk, the
-dependant modules are set aside to make it clear that they may not be used
-with commercial versions of Asterisk, unless other licensing arrangements are
+dependant modules are set aside to make it clear that they may not be used
+with commercial versions of Asterisk, unless other licensing arrangements are
made with the copyright holders of those dependencies.
Another reason that modules may be set aside is that there may be
additional restrictions on the usage of the code imposed by the license or
related patents. The MySQL and MP3 modules are examples of this.
-
+
If you have any questions, contact your lawyer.
===============================================================================
Agents:
-* The default for ackcall has been changed to "no" instead of "yes"
+* The default for ackcall has been changed to "no" instead of "yes"
because of a bug which caused the "yes" behavior to generally act like
- "no". You may need to adjust the value if your agents behave
+ "no". You may need to adjust the value if your agents behave
differently than you expect with respect to acknowledgement.
* The AgentCallBackLogin application now requires a second '|' before
Dialing:
-* The Caller*ID of the outbound leg is now the extension that was
- called, rather than the Caller*ID of the inbound leg of the call. The
- "o" flag for Dial can be used to restore the original behavior if
+* The Caller*ID of the outbound leg is now the extension that was
+ called, rather than the Caller*ID of the inbound leg of the call. The
+ "o" flag for Dial can be used to restore the original behavior if
desired. Note that if you are looking for the originating callerid
- from the manager event, there is a new manager event "Dial" which
+ from the manager event, there is a new manager event "Dial" which
provides the source and destination channels and callerid.
-IAX:
+IAX:
-* The naming convention for IAX channels has changed in two ways:
+* The naming convention for IAX channels has changed in two ways:
1. The call number follows a "-" rather than a "/" character.
2. The name of the channel has been simplified to IAX2/peer-callno,
rather than IAX2/peer@peer-callno or even IAX2/peer@peer/callno.
the other channel drivers and to avoid confusion with the "port"
option for users/peers.
-* The "Registry" event now uses "Username" rather than "User" for
+* The "Registry" event now uses "Username" rather than "User" for
consistency with IAX.
Applications:
* With the addition of dialplan functions (which operate similarly
to variables), the SetVar application has been renamed to Set.
-* The CallerPres application has been removed. Use SetCallerPres
+* The CallerPres application has been removed. Use SetCallerPres
instead. It accepts both numeric and symbolic names.
* The applications GetGroupCount, GetGroupMatchCount, SetGroup, and
moved to option 5.
* The application VoiceMailMain now only matches the 'default' context if
- none is specified in the arguments. (This was the previously
+ none is specified in the arguments. (This was the previously
documented behavior, however, we didn't follow that behavior.) The old
behavior can be restored by setting searchcontexts=yes in voicemail.conf.
* A queue is now considered empty not only if there are no members but if
none of the members are available (e.g. agents not logged on). To
- restore the original behavior, use "leavewhenempty=strict" or
+ restore the original behavior, use "leavewhenempty=strict" or
"joinwhenempty=strict" instead of "=yes" for those options.
* It is now possible to use multi-digit extensions in the exit context
Extensions:
* By default, there is a new option called "autofallthrough" in
- extensions.conf that is set to yes. Asterisk 1.0 (and earlier)
- behavior was to wait for an extension to be dialed after there were no
+ extensions.conf that is set to yes. Asterisk 1.0 (and earlier)
+ behavior was to wait for an extension to be dialed after there were no
more extensions to execute. "autofallthrough" changes this behavior
so that the call will immediately be terminated with BUSY,
CONGESTION, or HANGUP based on Asterisk's best guess. If you are
AGI:
-* AGI scripts did not always get SIGHUP at the end, previously. That
- behavior has been fixed. If you do not want your script to terminate
- at the end of AGI being called (e.g. on a hangup) then set SIGHUP to
+* AGI scripts did not always get SIGHUP at the end, previously. That
+ behavior has been fixed. If you do not want your script to terminate
+ at the end of AGI being called (e.g. on a hangup) then set SIGHUP to
be ignored within your application.
* CallerID is reported with agi_callerid and agi_calleridname instead
MeetMe:
* The conference application now allows users to increase/decrease their
- speaking volume and listening volume (independently of each other and
- other users); the 'admin' and 'user' menus have changed, and new sound
- files are included with this release. However, if a user calling in
- over a Zaptel channel that does NOT have hardware DTMF detection
- increases their speaking volume, it is likely they will no longer be
- able to enter/exit the menu or make any further adjustments, as the
- software DTMF detector will not be able to recognize the DTMF coming
+ speaking volume and listening volume (independently of each other and
+ other users); the 'admin' and 'user' menus have changed, and new sound
+ files are included with this release. However, if a user calling in
+ over a Zaptel channel that does NOT have hardware DTMF detection
+ increases their speaking volume, it is likely they will no longer be
+ able to enter/exit the menu or make any further adjustments, as the
+ software DTMF detector will not be able to recognize the DTMF coming
from their device.
GetVar Manager Action:
the configure script was added to the build process (except for having to run
'make' again after the configure script is run). Note that the configure script
does NOT need to be re-run just to rebuild Asterisk; you only need to re-run it
-when your system configuration changes or you wish to build Asterisk with
+when your system configuration changes or you wish to build Asterisk with
different options.
Build Process (module selection):
The Asterisk source tree now includes a basic module selection and build option
selection tool called 'menuselect'. Run 'make menuselect' to make your choices.
In this tool, you can disable building of modules that you don't care about,
-turn on/off global options for the build and see which modules will not
+turn on/off global options for the build and see which modules will not
(and cannot) be built because your system does not have the required external
dependencies installed.
not which ones are not in use.
If you would like to save your choices and have them applied against all
-builds, the file can be copied to '~/.asterisk.makeopts' or
+builds, the file can be copied to '~/.asterisk.makeopts' or
'/etc/asterisk.makeopts'.
Build Process (Makefile targets):
* The (very old and undocumented) ability to use BYEXTENSION for dialing
instead of ${EXTEN} has been removed.
-
+
* Builtin (res_features) transfer functionality attempts to use the context
defined in TRANSFER_CONTEXT variable of the transferer channel first. If
- not set, it uses the transferee variable. If not set in any channel, it will
+ not set, it uses the transferee variable. If not set in any channel, it will
attempt to use the last non macro context. If not possible, it will default
to the current context.
if your dialplan relies on the ability to 'run off the end' of an extension
and wait for a new extension without using WaitExten() to accomplish that,
you will need set autofallthrough to 'no' in your extensions.conf file.
-
+
Command Line Interface:
* 'show channels concise', designed to be used by applications that will parse
* OSPAuth is added to authenticate OSP tokens in in_bound call setup messages.
-* The CONNECT event in the queue_log from app_queue now has a second field
- in addition to the holdtime field. It contains the unique ID of the
- queue member channel that is taking the call. This is useful when trying
- to link recording filenames back to a particular call from the queue.
+* The CONNECT event in the queue_log from app_queue now has a second field
+ in addition to the holdtime field. It contains the unique ID of the
+ queue member channel that is taking the call. This is useful when trying
+ to link recording filenames back to a particular call from the queue.
* The old/current behavior of app_queue has a serial type behavior
in that the queue will make all waiting callers wait in the queue
waits while this happens. This cycle continues until there are
no more available members or waiting callers, whichever comes first.
The new behavior, enabled by setting autofill=yes in queues.conf
- either at the [general] level to default for all queues or
- to set on a per-queue level, makes sure that when the waiting
- callers are connecting with available members in a parallel fashion
+ either at the [general] level to default for all queues or
+ to set on a per-queue level, makes sure that when the waiting
+ callers are connecting with available members in a parallel fashion
until there are no more available members or no more waiting callers,
whichever comes first. This is probably more along the lines of how
- one would expect a queue should work and in most cases, you will want
- to enable this new behavior. If you do not specify or comment out this
- option, it will default to "no" to keep backward compatability with the old
+ one would expect a queue should work and in most cases, you will want
+ to enable this new behavior. If you do not specify or comment out this
+ option, it will default to "no" to keep backward compatability with the old
behavior.
* Queues depend on the channel driver reporting the proper state
call-limit=10
-* The app_queue application now has the ability to use MixMonitor to
+* The app_queue application now has the ability to use MixMonitor to
record conversations queue members are having with queue callers. Please
see configs/queues.conf.sample for more information on this option.
other external program in order to mix the audio.
* app_meetme: The 'm' option (monitor) is renamed to 'l' (listen only), and
- the 'm' option now provides the functionality of "initially muted".
+ the 'm' option now provides the functionality of "initially muted".
In practice, most existing dialplans using the 'm' flag should not notice
- any difference, unless the keypad menu is enabled, allowing the user
+ any difference, unless the keypad menu is enabled, allowing the user
to unmute themsleves.
* ast_play_and_record would attempt to cancel the recording if a DTMF
previously used only by EXTENDED_ODBC_STORAGE. This means that you will need to update
your table format using the schema provided in doc/odbcstorage.txt
-* app_waitforsilence: Fixes have been made to this application which changes the
+* app_waitforsilence: Fixes have been made to this application which changes the
default behavior with how quickly it returns. You can maintain "old-style" behavior
with the addition/use of a third "timeout" parameter.
- Please consult the application documentation and make changes to your dialplan
+ Please consult the application documentation and make changes to your dialplan
if appropriate.
Manager:
until after the release of 1.4, when it will be removed. Please use the time
during the 1.4 release to make this transition.
-* The AgentConnect event now has an additional field called "BridgedChannel"
- which contains the unique ID of the queue member channel that is taking the
- call. This is useful when trying to link recording filenames back to
+* The AgentConnect event now has an additional field called "BridgedChannel"
+ which contains the unique ID of the queue member channel that is taking the
+ call. This is useful when trying to link recording filenames back to
a particular call from the queue.
* app_userevent has been modified to always send Event: UserEvent with the
functions. You are encouraged to move towards the associated dialplan
function, as these variables will be removed in a future release.
-* The CDR-CSV variables uniqueid, userfield, and basing time on GMT are now
+* The CDR-CSV variables uniqueid, userfield, and basing time on GMT are now
adjustable from cdr.conf, instead of recompiling.
* OSP applications exports several new variables, ${OSPINHANDLE},
${OSPOUTHANDLE}, ${OSPINTOKEN}, ${OSPOUTTOKEN}, ${OSPCALLING},
${OSPINTIMELIMIT}, and ${OSPOUTTIMELIMIT}
-
+
* Builtin transfer functionality sets the variable ${TRANSFERERNAME} in the new
created channel. This variables holds the channel name of the transferer.
-* The dial plan variable PRI_CAUSE will be removed from future versions
+* The dial plan variable PRI_CAUSE will be removed from future versions
of Asterisk.
It is replaced by adding a cause value to the hangup() application.
modules.conf file then you will need to explicitly load the modules that
contain the functions you want to use.
-* The ENUMLOOKUP() function with the 'c' option (for counting the number of
- records), but the lookup fails to match any records, the returned value will
+* The ENUMLOOKUP() function with the 'c' option (for counting the number of
+ records), but the lookup fails to match any records, the returned value will
now be "0" instead of blank.
* The REALTIME() function is now available in version 1.4 and app_realtime has
which user you want based on host.
If you would like to go ahead and use the new behavior which doesn't use the
- order in the config file to influence matching order, then change the
+ order in the config file to influence matching order, then change the
MAX_PEER_BUCKETS define in chan_iax2.c to a value greater than one. An
example is provided there. By changing this, you will get *much* better
performance on systems that do a lot of peer and user lookups as they will be
The SIP channel:
-* The "incominglimit" setting is replaced by the "call-limit" setting in
+* The "incominglimit" setting is replaced by the "call-limit" setting in
sip.conf.
-* OSP support code is removed from SIP channel to OSP applications. ospauth
+* OSP support code is removed from SIP channel to OSP applications. ospauth
option in sip.conf is removed to osp.conf as authpolicy. allowguest option
- in sip.conf cannot be set as osp anymore.
+ in sip.conf cannot be set as osp anymore.
* The Asterisk RTP stack has been changed in regards to RFC2833 reception
and transmission. Packets will now be sent with proper duration instead of all
Installation:
* On BSD systems, the installation directories have changed to more "FreeBSDish"
- directories. On startup, Asterisk will look for the main configuration in
+ directories. On startup, Asterisk will look for the main configuration in
/usr/local/etc/asterisk/asterisk.conf
- If you have an old installation, you might want to remove the binaries and
- move the configuration files to the new locations. The following directories
+ If you have an old installation, you might want to remove the binaries and
+ move the configuration files to the new locations. The following directories
are now default:
ASTLIBDIR /usr/local/lib/asterisk
ASTVARLIBDIR /usr/local/share/asterisk
set. When using the "callerid" option for various channel drivers, some
would set ANI and some would not. This has been cleared up so that all
channel drivers set ANI. If you would like to change the callerid number
- on the channel from the dialplan and have that change also show up in the
+ on the channel from the dialplan and have that change also show up in the
CDR, then you *must* set CALLERID(ANI) as well as CALLERID(num).
API:
* format_wav: The GAIN preprocessor definition has been changed from 2 to 0
in Asterisk 1.4. This change was made in response to user complaints of
choppiness or the clipping of loud signal peaks. The GAIN preprocessor
- definition will be retained in Asterisk 1.4, but will be removed in a
+ definition will be retained in Asterisk 1.4, but will be removed in a
future release. The use of GAIN for the increasing of voicemail message
volume should use the 'volgain' option in voicemail.conf
-
sound file installer in the Makefile).
* The ast_expr2 stuff has been modified to handle floating-point numbers.
- Numbers of the format D.D are now acceptable input for the expr parser,
+ Numbers of the format D.D are now acceptable input for the expr parser,
Where D is a string of base-10 digits. All math is now done in "long double",
if it is available on your compiler/architecture. This was half-way between
a bug-fix (because the MATH func returns fp by default), and an enhancement.
of rounding/truncation, along with a set of common floating point operations,
like sin, cos, tan, log, pow, etc. The ability to call external functions
like CDR(), etc. was also added, without having to use the ${...} notation.
-
+
* The delimiter passed to applications has been changed to the comma (','), as
that is what people are used to using within extensions.conf. If you are
using realtime extensions, you will need to translate your existing dialplan
Channel Drivers:
* SIP: a small upgrade to support the "Record" button on the SNOM360,
- which sends a sip INFO message with a "Record: on" or "Record: off"
+ which sends a sip INFO message with a "Record: on" or "Record: off"
header. If Asterisk is set up (via features.conf) to accept "One Touch Monitor"
requests (by default, via '*1'), then the user-configured dialpad sequence
is generated, and recording can be started and stopped via this button. The
now renamed to "counteronpeer".
* SIP: The "username" option is now renamed to "defaultuser" to match "defaultip".
- These are used only before registration to call a peer with the uri
+ These are used only before registration to call a peer with the uri
sip:defaultuser@defaultip
- The "username" setting still work, but is deprecated and will not work in
+ The "username" setting still work, but is deprecated and will not work in
the next version of Asterisk.
* SIP: The old "insecure" options, deprecated in 1.4, have been removed.
Configuration:
* pbx_dundi.c: tos parameter changed to use new values. Old values like lowdelay,
- lowcost and other is not acceptable now. Look into qos.tex for description of
+ lowcost and other is not acceptable now. Look into qos.tex for description of
this parameter.
* queues.conf: the queue-lessthan sound file option is no longer available, and the
Manager:
-* Manager has been upgraded to version 1.1 with a lot of changes.
+* Manager has been upgraded to version 1.1 with a lot of changes.
Please check doc/manager_1_1.txt for information
* The IAXpeers command output has been changed to more closely resemble the
it is set to load. If not, then any module which uses RTP (such as chan_sip)
will not be able to send or receive calls.
-* The app_dahdiscan.c file has been removed, but the dialplan app DAHDIScan still
- remains. It now exists within app_chanspy.c and retains the exact same
- functionality as before.
+* The app_dahdiscan.c file has been removed, but the dialplan app DAHDIScan still
+ remains. It now exists within app_chanspy.c and retains the exact same
+ functionality as before.
* The default behavior for Set, AGI, and pbx_realtime has been changed to implement
1.6 behavior by default, if there is no [compat] section in asterisk.conf. In
* ExternalIVR will now send Z events for invalid or missing files, T events
now include the interrupted file and bugs in argument parsing have been
fixed so there may be arguments specified in incorrect ways that were
- working that will no longer work. Please see
+ working that will no longer work. Please see
https://wiki.asterisk.org/wiki/display/AST/External+IVR+Interface for details.
* OSP lookup application changes following variable names:
* SIP no longer sends the 183 progress message for early media by
default. Applications requiring early media should use the
- progress() dialplan app to generate the progress message.
+ progress() dialplan app to generate the progress message.
* The firmware for the IAXy has been removed from Asterisk. It can be
downloaded from http://downloads.digium.com/pub/iaxy/. To have Asterisk
* DAHDISendCallreroutingFacility() parameters are now comma-separated,
instead of the old pipe.
-* res_jabber: autoprune has been disabled by default, to avoid misconfiguration
- that would end up being interpreted as a bug once Asterisk started removing
+* res_jabber: autoprune has been disabled by default, to avoid misconfiguration
+ that would end up being interpreted as a bug once Asterisk started removing
the contacts from a user list.
* The cdr.conf file must exist and be configured correctly in order for CDR
* If you use ODBC storage for voicemail, there is a new field called "flag"
which should be a char(8) or larger. This field specifies whether or not a
message has been designated to be "Urgent", "PRIORITY", or not.
-
convert an existing astdb to the SQLite3 version automatically at runtime.
Module Support Level
- - All modules in the addons, apps, bridge, cdr, cel, channels, codecs,
+ - All modules in the addons, apps, bridge, cdr, cel, channels, codecs,
formats, funcs, pbx, and res have been updated to include MODULEINFO data
that includes <support_level> tags with a value of core, extended, or deprecated.
- More information is available on the Asterisk wiki at
+ More information is available on the Asterisk wiki at
https://wiki.asterisk.org/wiki/display/AST/Asterisk+Module+Support+States
Deprecated modules are now marked to not build by default and must be explicitly
configuration option. Symptoms of this include one way media or no media flow.
chan_unistim
- - Due to massive update in chan_unistim phone keys functions and on-screen
+ - Due to massive update in chan_unistim phone keys functions and on-screen
information changed.
users.conf:
unchanged.
Module Support Level
- - All modules in the addons, apps, bridge, cdr, cel, channels, codecs,
+ - All modules in the addons, apps, bridge, cdr, cel, channels, codecs,
formats, funcs, pbx, and res have been updated to include MODULEINFO data
that includes <support_level> tags with a value of core, extended, or deprecated.
- More information is available on the Asterisk wiki at
+ More information is available on the Asterisk wiki at
https://wiki.asterisk.org/wiki/display/AST/Asterisk+Module+Support+States
Deprecated modules are now marked to not build by default and must be explicitly
- Configuration is found in res_parking.conf. It is no longer supported in
features.conf
- - The arguments for the Park, ParkedCall, and ParkAndAnnounce applications
- have been modified significantly. See the application documents for
+ - The arguments for the Park, ParkedCall, and ParkAndAnnounce applications
+ have been modified significantly. See the application documents for
specific details.
- Numerous changes to Parking related applications, AMI and CLI commands and
- internal inter-workings have been made. Please read the CHANGES file for
+ internal inter-workings have been made. Please read the CHANGES file for
the detailed list.
Security Events Framework:
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page app_mysql.conf app_mysql.conf
* \verbinclude app_mysql.conf.sample
*/
unsigned int port = 0;
char *port_str;
char *parse = ast_strdupa(data);
-
+
AST_NONSTANDARD_APP_ARGS(args, parse, ' ');
if (args.argc < 6) {
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
}
AST_MODULE_INFO_STANDARD_DEPRECATED(ASTERISK_GPL_KEY, "Simple Mysql Interface");
-
.unload = unload_module,
.reload = reload,
);
-
* at the top of the source tree.
*/
-/*!
+/*!
* \file
* \brief Bluetooth Mobile Device channel driver
*
* \verbatim
* \r\n<result code>\r\n
* <at command>\r
- * \r\n>
+ * \r\n>
* \endverbatim
*
* These formats correspond to AT result codes, AT commands, and the AT SMS
int index = -1;
/* parse cmti info in the following format:
- * +CMTI: <mem>,<index>
+ * +CMTI: <mem>,<index>
*/
if (!sscanf(buf, "+CMTI: %*[^,],%d", &index)) {
ast_debug(2, "[%s] error parsing CMTI event '%s'\n", hfp->owner->id, buf);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
static enum ast_rtp_glue_result ooh323_get_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance **rtp);
static enum ast_rtp_glue_result ooh323_get_vrtp_peer(struct ast_channel *chan, struct ast_rtp_instance **rtp);
-static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *rtp,
+static int ooh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *rtp,
struct ast_rtp_instance *vrtp, struct ast_rtp_instance *trtp, const struct ast_format_cap *codecs, int nat_active);
static void ooh323_get_codec(struct ast_channel *chan, struct ast_format_cap *result);
void setup_rtp_remote(ooCallData *call, const char *remoteIp, int remotePort);
char callee_dialedDigits[AST_MAX_EXTENSION];
char callee_email[AST_MAX_EXTENSION];
char callee_url[AST_MAX_EXTENSION];
-
+
int port;
struct ast_format *readformat; /* negotiated read format */
struct ast_format *writeformat; /* negotiated write format */
static struct ast_sched_context *sched;
static struct io_context *io;
-/* Protect the monitoring thread, so only one process can kill or start it,
+/* Protect the monitoring thread, so only one process can kill or start it,
and not when it's doing something critical. */
AST_MUTEX_DEFINE_STATIC(monlock);
static struct ast_channel *ooh323_new(struct ooh323_pvt *i, int state,
- const char *host, struct ast_format_cap *cap,
+ const char *host, struct ast_format_cap *cap,
const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor)
{
struct ast_format_cap *caps = NULL;
/* Don't hold a h323 pvt lock while we allocate a channel */
ast_mutex_unlock(&i->lock);
ast_mutex_lock(&ooh323c_cn_lock);
- ch = ast_channel_alloc(1, state, i->callerid_num, i->callerid_name,
+ ch = ast_channel_alloc(1, state, i->callerid_num, i->callerid_name,
i->accountcode, i->exten, i->context, assignedids, requestor, i->amaflags,
"OOH323/%s-%ld", host, callnumber);
callnumber++;
ast_mutex_unlock(&ooh323c_cn_lock);
-
+
ast_mutex_lock(&i->lock);
if (ch && caps) {
ast_channel_priority_set(ch, 1);
if(!ast_test_flag(i, H323_OUTGOING)) {
-
+
if (!ast_strlen_zero(i->caller_h323id)) {
pbx_builtin_setvar_helper(ch, "_CALLER_H323ID", i->caller_h323id);
}
if (!ast_strlen_zero(i->caller_dialedDigits)) {
- pbx_builtin_setvar_helper(ch, "_CALLER_H323DIALEDDIGITS",
+ pbx_builtin_setvar_helper(ch, "_CALLER_H323DIALEDDIGITS",
i->caller_dialedDigits);
}
if (!ast_strlen_zero(i->caller_email)) {
- pbx_builtin_setvar_helper(ch, "_CALLER_H323EMAIL",
+ pbx_builtin_setvar_helper(ch, "_CALLER_H323EMAIL",
i->caller_email);
}
if (!ast_strlen_zero(i->caller_url)) {
if (!ast_strlen_zero(i->accountcode))
ast_channel_accountcode_set(ch, i->accountcode);
-
+
if (i->amaflags)
ast_channel_amaflags_set(ch, i->amaflags);
ast_channel_unlock(ch);
ast_hangup(ch);
ch = NULL;
- }
+ }
}
if (ch) {
-static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken)
+static struct ooh323_pvt *ooh323_alloc(int callref, char *callToken)
{
struct ooh323_pvt *pvt = NULL;
pvt->aniasdni = gANIasDNI;
- ast_mutex_unlock(&pvt->lock);
+ ast_mutex_unlock(&pvt->lock);
/* Add to interface list */
ast_mutex_lock(&iflock);
pvt->next = iflist;
struct ast_channel *chan = NULL;
struct ooh323_pvt *p = NULL;
struct ooh323_peer *peer = NULL;
- char *dest = NULL;
+ char *dest = NULL;
char *ext = NULL;
char tmp[256];
int port = 0;
dest = strchr(tmp, '/');
- if (dest) {
+ if (dest) {
*dest = '\0';
dest++;
ext = dest;
chan = ooh323_new(p, AST_STATE_DOWN, p->username, cap,
assignedids, requestor);
-
+
ast_mutex_unlock(&p->lock);
if (!chan) {
struct ooh323_peer *find_friend(const char *name, int port)
{
- struct ooh323_peer *peer;
+ struct ooh323_peer *peer;
if (gH323Debug)
ast_verb(0, "--- find_friend \"%s\"\n", name);
ast_verb(0, "+++ find_friend \"%s\"\n", name);
}
- return peer;
+ return peer;
}
ast_verb(0, "+++ find_peer \"%s\"\n", name);
}
- return peer;
+ return peer;
}
static int ooh323_digit_begin(struct ast_channel *chan, char digit)
char dtmf[2];
struct ooh323_pvt *p = (struct ooh323_pvt *) ast_channel_tech_pvt(chan);
int res = 0;
-
+
if (gH323Debug)
ast_verb(0, "--- ooh323_digit_begin\n");
if ((val = pbx_builtin_getvar_helper(ast, "CALLER_H323ID"))) {
ast_copy_string(p->caller_h323id, val, sizeof(p->caller_h323id));
}
-
+
if ((val = pbx_builtin_getvar_helper(ast, "CALLER_H323DIALEDDIGITS"))) {
ast_copy_string(p->caller_dialedDigits, val, sizeof(p->caller_dialedDigits));
if(!p->callerid_num)
if (gH323Debug)
ast_verb(0, " hanging %s with cause: %d\n", p->username, q931cause);
- ast_channel_tech_pvt_set(ast, NULL);
+ ast_channel_tech_pvt_set(ast, NULL);
if (!ast_test_flag(p, H323_ALREADYGONE)) {
- ooHangCall(p->callToken,
+ ooHangCall(p->callToken,
ooh323_convert_hangupcause_asteriskToH323(q931cause), q931cause);
ast_set_flag(p, H323_ALREADYGONE);
/* ast_mutex_unlock(&p->lock); */
- } else
+ } else
ast_set_flag(p, H323_NEEDDESTROY);
/* detach channel here */
if (p->owner) {
/* Notify the module monitors that use count for resource has changed */
ast_update_use_count();
-
+
} else {
ast_debug(1, "No call to hangup\n" );
}
-
+
if (gH323Debug)
ast_verb(0, "+++ ooh323_hangup\n");
ast_channel_lock(ast);
if (!p->alertsent) {
if (gH323Debug) {
- ast_debug(1, "Sending forced ringback for %s, res = %u\n",
+ ast_debug(1, "Sending forced ringback for %s, res = %u\n",
callToken, ooManualRingback(callToken));
} else {
ooManualRingback(callToken);
return res;
}
-
+
if (f->frametype == AST_FRAME_VOICE) {
/* sending progress for first */
if (!ast_test_flag(p, H323_OUTGOING) && !p->progsent &&
ast_mutex_unlock(&p->lock);
return 0;
} else {
- ast_log(LOG_WARNING, "Can't send %u type frames with OOH323 write\n",
+ ast_log(LOG_WARNING, "Can't send %u type frames with OOH323 write\n",
f->frametype);
ast_mutex_unlock(&p->lock);
return 0;
if (gH323Debug) {
ast_verb(0, "----- ooh323_indicate %d on call %s\n", condition, callToken);
}
-
+
ast_mutex_lock(&p->lock);
switch (condition) {
case AST_CONTROL_INCOMPLETE:
if (!p->progsent) {
if (gH323Debug) {
ast_debug(1, "Sending manual progress for %s, res = %u\n", callToken,
- ooManualProgress(callToken));
+ ooManualProgress(callToken));
} else {
ooManualProgress(callToken);
}
if (gH323Debug)
ast_verb(0, "----- ooh323_queryoption %d on channel %s\n", option, ast_channel_name(ast));
-
+
switch (option) {
case AST_OPTION_T38_STATE:
if (gH323Debug)
ast_verb(0, "+++++ ooh323_queryoption %d on channel %s\n", option, ast_channel_name(ast));
-
+
ast_mutex_unlock(&p->lock);
return res;
struct ooh323_pvt *p = NULL;
if (gH323Debug)
- ast_verb(0, "--- ooh323_update_writeformat %s/%d\n",
+ ast_verb(0, "--- ooh323_update_writeformat %s/%d\n",
ast_format_get_name(fmt), txframes);
-
+
p = find_call(call);
if (!p) {
ast_log(LOG_ERROR, "No matching call found for %s\n", call->callToken);
}
if (gH323Debug) {
struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
- ast_verb(0, "Writeformat before update %s/%s\n",
+ ast_verb(0, "Writeformat before update %s/%s\n",
ast_format_get_name(ast_channel_writeformat(p->owner)),
ast_format_cap_get_names(ast_channel_nativeformats(p->owner), &codec_buf));
}
struct ooh323_pvt *p = NULL;
if (gH323Debug)
- ast_verb(0, "--- ooh323_update_readformat %s\n",
+ ast_verb(0, "--- ooh323_update_readformat %s\n",
ast_format_get_name(fmt));
-
+
p = find_call(call);
if (!p) {
ast_log(LOG_ERROR, "No matching call found for %s\n", call->callToken);
}
if (gH323Debug) {
- ast_verb(0, "Readformat before update %s\n",
+ ast_verb(0, "Readformat before update %s\n",
ast_format_get_name(ast_channel_readformat(p->owner)));
}
ast_format_cap_append(caps, fmt, 0);
if(!p) {
ast_log(LOG_ERROR, "No matching call found\n");
return -1;
- }
+ }
ast_mutex_lock(&p->lock);
if (!p->owner) {
ast_mutex_unlock(&p->lock);
if(!p) {
ast_log(LOG_ERROR, "No matching call found\n");
return -1;
- }
+ }
ast_mutex_lock(&p->lock);
if (!p->owner) {
ast_mutex_unlock(&p->lock);
}
ast_mutex_lock(&p->lock);
ast_clear_flag(p, H323_OUTGOING);
-
+
if (call->remoteDisplayName) {
p->callerid_name = strdup(call->remoteDisplayName);
{
if(!p->callerid_num)
p->callerid_num = strdup(alias->value);
- ast_copy_string(p->caller_dialedDigits, alias->value,
+ ast_copy_string(p->caller_dialedDigits, alias->value,
sizeof(p->caller_dialedDigits));
}
else if(alias->type == T_H225AliasAddress_email_ID)
if (user->rtpmask && user->rtpmaskstr[0]) {
p->rtpmask = user->rtpmask;
- ast_copy_string(p->rtpmaskstr, user->rtpmaskstr,
+ ast_copy_string(p->rtpmaskstr, user->rtpmaskstr,
sizeof(p->rtpmaskstr));
}
if (user->rtdrcount > 0 && user->rtdrinterval > 0) {
ooCallSetCallerId(call, p->callerid_num);
}
}
-
+
if (!ast_strlen_zero(p->caller_h323id))
ooCallAddAliasH323ID(call, p->caller_h323id);
ooCallSetCallerId(call, p->callerid_num);
}
}
-
+
if (!ast_strlen_zero(p->caller_h323id))
ooCallAddAliasH323ID(call, p->caller_h323id);
ooCallAddAliasH323ID(call, p->callerid_num);
}
}
-
+
if (!ast_strlen_zero(p->exten)) {
if (ooIsDailedDigit(p->exten)) {
if (gH323Debug) {
struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
- ast_verb(0, " Outgoing call %s(%s) - Codec prefs - %s\n",
+ ast_verb(0, " Outgoing call %s(%s) - Codec prefs - %s\n",
p->username?p->username:"NULL", call->callToken,
ast_format_cap_get_names(p->cap, &codec_buf));
}
ast_log(LOG_ERROR, "Channel has no owner\n");
return -1;
}
-
+
while (p->owner && ast_channel_trylock(p->owner)) {
ast_debug(1, "Failed to grab lock, trying again\n");
DEADLOCK_AVOIDANCE(&p->lock);
if ((p = find_call(call))) {
ast_mutex_lock(&p->lock);
-
+
while (p->owner) {
if (ast_channel_trylock(p->owner)) {
ooTrace(OOTRCLVLINFO, "Failed to grab lock, trying again\n");
}
if (ownerLock) {
- if (!ast_test_flag(p, H323_ALREADYGONE)) {
+ if (!ast_test_flag(p, H323_ALREADYGONE)) {
ast_set_flag(p, H323_ALREADYGONE);
ast_channel_hangupcause_set(p->owner, call->q931cause);
if (gH323Debug)
ast_verb(0, "--- ooh323_delete_user\n");
- if (user) {
+ if (user) {
cur = userl.users;
ast_mutex_lock(&userl.lock);
while (cur) {
ast_mutex_unlock(&userl.lock);
free(user);
- }
+ }
if (gH323Debug)
ast_verb(0, "+++ ooh323_delete_user\n");
if (gH323Debug)
ast_verb(0, "--- ooh323_delete_peer\n");
- if (peer) {
+ if (peer) {
cur = peerl.peers;
ast_mutex_lock(&peerl.lock);
while(cur) {
ao2_cleanup(peer->cap);
free(peer);
- }
+ }
if (gH323Debug)
ast_verb(0, "+++ ooh323_delete_peer\n");
user->rtptimeout = gRTPTimeout;
} else if (!strcasecmp(v->name, "rtpmask")) {
if ((user->rtpmask = ast_calloc(1, sizeof(struct OOH323Regex))) &&
- (regcomp(&user->rtpmask->regex, v->value, REG_EXTENDED)
+ (regcomp(&user->rtpmask->regex, v->value, REG_EXTENDED)
== 0)) {
ast_mutex_init(&user->rtpmask->lock);
user->rtpmask->inuse = 1;
- ast_copy_string(user->rtpmaskstr, v->value,
+ ast_copy_string(user->rtpmaskstr, v->value,
sizeof(user->rtpmaskstr));
} else user->rtpmask = NULL;
} else if (!strcasecmp(v->name, "disallow")) {
struct ast_sockaddr p;
if (!ast_parse_arg(v->value, PARSE_ADDR, &p)) {
ast_copy_string(user->mIP, ast_sockaddr_stringify_addr(&p), sizeof(user->mIP)-1);
- } else {
+ } else {
ast_copy_string(user->mIP, v->value, sizeof(user->mIP)-1);
}
user->mUseIP = 1;
struct ast_sockaddr p;
if (!ast_parse_arg(v->value, PARSE_ADDR, &p)) {
ast_copy_string(peer->ip, ast_sockaddr_stringify_host(&p), sizeof(peer->ip));
- } else {
+ } else {
ast_copy_string(peer->ip, v->value, sizeof(peer->ip));
}
-
+
} else if (!strcasecmp(v->name, "outgoinglimit")) {
peer->outgoinglimit = atoi(v->value);
if (peer->outgoinglimit < 0)
peer->rtptimeout = gRTPTimeout;
} else if (!strcasecmp(v->name, "rtpmask")) {
if ((peer->rtpmask = ast_calloc(1, sizeof(struct OOH323Regex))) &&
- (regcomp(&peer->rtpmask->regex, v->value, REG_EXTENDED)
+ (regcomp(&peer->rtpmask->regex, v->value, REG_EXTENDED)
== 0)) {
ast_mutex_init(&peer->rtpmask->lock);
peer->rtpmask->inuse = 1;
- ast_copy_string(peer->rtpmaskstr, v->value,
+ ast_copy_string(peer->rtpmaskstr, v->value,
sizeof(peer->rtpmaskstr));
} else peer->rtpmask = NULL;
} else if (!strcasecmp(v->name, "disallow")) {
reload_config(1);
/* Gatekeeper */
- if (gRasGkMode == RasUseSpecificGatekeeper ||
+ if (gRasGkMode == RasUseSpecificGatekeeper ||
gRasGkMode == RasDiscoverGatekeeper) {
- ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
+ ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
gGatekeeper : 0, 0);
ooGkClientStart(gH323ep.gkClient);
}
case T_H225AliasAddress_h323_ID:
ooH323EpAddAliasH323ID(pNewAlias->value);
break;
- case T_H225AliasAddress_dialedDigits:
+ case T_H225AliasAddress_dialedDigits:
ooH323EpAddAliasDialedDigits(pNewAlias->value);
break;
- case T_H225AliasAddress_email_ID:
+ case T_H225AliasAddress_email_ID:
ooH323EpAddAliasEmailID(pNewAlias->value);
break;
default:
v = v->next;
continue;
}
-
+
if (!strcasecmp(v->name, "port")) {
gPort = (int)strtol(v->value, NULL, 10);
} else if (!strcasecmp(v->name, "bindaddr")) {
gMediaWaitForConnect = ast_true(v->value);
if (gMediaWaitForConnect)
ooH323EpEnableMediaWaitForConnect();
- else
+ else
ooH323EpDisableMediaWaitForConnect();
} else if (!strcasecmp(v->name, "h245tunneling")) {
gTunneling = ast_true(v->value);
gBeMaster = ast_true(v->value);
if (gBeMaster)
ooH323EpTryBeMaster(1);
- else
+ else
ooH323EpTryBeMaster(0);
} else if (!strcasecmp(v->name, "h323id")) {
pNewAlias = ast_calloc(1, sizeof(struct ooAliases));
else if (!strcasecmp(v->value, "h245signal"))
gDTMFMode = H323_DTMF_H245SIGNAL;
else {
- ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n",
+ ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n",
v->value);
gDTMFMode = H323_DTMF_RFC2833;
}
}
v = v->next;
}
-
+
for (cat = ast_category_browse(cfg, NULL); cat; cat = ast_category_browse(cfg, cat)) {
if (strcasecmp(cat, "general")) {
int friend_type = 0;
{
char ip_port[64];
struct ooh323_peer *prev = NULL, *peer = NULL;
-
+
switch (cmd) {
case CLI_INIT:
e->command = "ooh323 show peer";
while (peer) {
ast_mutex_lock(&peer->lock);
snprintf(ip_port, sizeof(ip_port), "%s:%hu", peer->ip, peer->port);
- ast_cli(a->fd, FORMAT, peer->name,
+ ast_cli(a->fd, FORMAT, peer->name,
peer->accountcode,
ip_port,
ast_format_cap_get_names(peer->cap, &codec_buf));
while(user)
{
ast_mutex_lock(&user->lock);
- ast_cli(a->fd, FORMAT1, user->name,
+ ast_cli(a->fd, FORMAT1, user->name,
user->accountcode, user->context,
ast_format_cap_get_names(user->cap, &codec_buf));
prev = user;
.onMediaChanged = (cb_OnMediaChanged) setup_rtp_remote,
};
if (!(gCap = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
- return AST_MODULE_LOAD_DECLINE;
+ return AST_MODULE_LOAD_DECLINE;
}
if (!(ooh323_tech.capabilities = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_DEFAULT))) {
ao2_ref(gCap, -1);
ast_mutex_init(&userl.lock);
peerl.peers = NULL;
ast_mutex_init(&peerl.lock);
-
-#if 0
+
+#if 0
ast_register_atexit(&ast_ooh323c_exit);
#endif
if (!reload_config(0)) {
- /* fire up the H.323 Endpoint */
+ /* fire up the H.323 Endpoint */
if (OO_OK != ooH323EpInitialize(OO_CALLMODE_AUDIOCALL, gLogFile)) {
ast_log(LOG_ERROR, "Failed to initialize OOH323 endpoint-"
"OOH323 Disabled\n");
ast_debug(1, "OOH323 channel is in IP6 mode\n");
}
ooH323EpSetCallerID(gCallerID);
-
+
if(ooH323EpSetTCPPortRange(ooconfig.mTCPPortStart, ooconfig.mTCPPortEnd) == OO_FAILED) {
ast_log(LOG_ERROR, "h225portrange: Failed to set range\n");
}
case T_H225AliasAddress_h323_ID:
ooH323EpAddAliasH323ID(pNewAlias->value);
break;
- case T_H225AliasAddress_dialedDigits:
+ case T_H225AliasAddress_dialedDigits:
ooH323EpAddAliasDialedDigits(pNewAlias->value);
break;
- case T_H225AliasAddress_email_ID:
+ case T_H225AliasAddress_email_ID:
ooH323EpAddAliasEmailID(pNewAlias->value);
break;
default:
peer = peer->next;
}
ast_mutex_unlock(&peerl.lock);
-
+
if (gMediaWaitForConnect)
ooH323EpEnableMediaWaitForConnect();
- else
+ else
ooH323EpDisableMediaWaitForConnect();
/* Fast start and tunneling options */
ooh323_tech.capabilities = NULL;
return 1;
}
-
+
/* Create H.323 listener */
if (ooCreateH323Listener() != OO_OK) {
ast_log(LOG_ERROR, "OOH323 Listener Creation failure. "
"OOH323 DISABLED\n");
-
+
ooH323EpDestroy();
ao2_ref(gCap, -1);
gCap = NULL;
if (gH323ep.gkClient && gH323ep.gkClient->state == GkClientStopped) {
ooGkClientDestroy();
ast_verb(0, "Restart stopped gatekeeper client\n");
- ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
+ ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ?
gGatekeeper : 0, 0);
ooGkClientStart(gH323ep.gkClient);
}
ast_log(LOG_NOTICE, "Disconnecting call '%s' for lack of RTP activity in %ld seconds\n", ast_channel_name(h323->owner), (long) (t - h323->lastrtprx));
ast_channel_unlock(h323->owner);
}
-
+
}
if (ast_test_flag(h323, H323_NEEDDESTROY)) {
iflist = cur->next;
if (cur->callToken) {
- if (gH323Debug)
+ if (gH323Debug)
ast_verb(0, " Destroying %s\n", cur->callToken);
ast_free(cur->callToken);
cur->callToken = 0;
free(cur->callerid_name);
cur->callerid_name = 0;
}
-
+
if (cur->callerid_num) {
free(cur->callerid_num);
cur->callerid_num = 0;
ast_udptl_destroy(cur->udptl);
cur->udptl = NULL;
}
-
+
/* Unlink us from the owner if we have one */
if (cur->owner) {
while(ast_channel_trylock(cur->owner)) {
ast_debug(1, "Failed to grab lock, trying again\n");
DEADLOCK_AVOIDANCE(&cur->lock);
- }
+ }
ast_debug(1, "Detaching from %s\n", ast_channel_name(cur->owner));
ast_channel_tech_pvt_set(cur->owner, NULL);
ast_channel_unlock(cur->owner);
cur->owner = NULL;
ast_module_unref(myself);
}
-
+
if (cur->vad) {
ast_dsp_free(cur->vad);
cur->vad = NULL;
if (gH323Debug) {
ast_verb(0, " unload_module - stopping monitor thread\n");
- }
+ }
if (monitor_thread != AST_PTHREADT_NULL) {
if (!ast_mutex_lock(&monlock)) {
if (monitor_thread && (monitor_thread != AST_PTHREADT_STOP)) {
ast_log(LOG_WARNING, "Unable to lock the interface list\n");
return -1;
}
-
+
if (gH323Debug) {
ast_verb(0, " unload_module - deleting users\n");
ast_rtp_instance_set_timeout(p->rtp, p->rtptimeout);
}
ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 1);
-
+
}
if (p->rtdrcount) {
udptl handling functions
*/
-void setup_udptl_connection(ooCallData *call, const char *remoteIp,
+void setup_udptl_connection(ooCallData *call, const char *remoteIp,
int remotePort)
{
struct ooh323_pvt *p = NULL;
ast_verb(0, "--- setup_udptl_connection\n");
/* Find the call or allocate a private structure if call not found */
- p = find_call(call);
+ p = find_call(call);
if (!p) {
ast_log(LOG_ERROR, "Something is wrong: rtp\n");
{
int updated = -1;
ooAliases *psAlias = NULL;
-
+
if (!call->ourAliases)
return updated;
for (psAlias = call->ourAliases; psAlias; psAlias = psAlias->next) {
updated = 1;
}
if (psAlias->type == T_H225AliasAddress_dialedDigits) {
- ast_copy_string(p->callee_dialedDigits, psAlias->value,
+ ast_copy_string(p->callee_dialedDigits, psAlias->value,
sizeof(p->callee_dialedDigits));
updated = 1;
}
}
parameters.max_ifp = ast_udptl_get_far_max_ifp(p->udptl);
parameters.rate = AST_T38_RATE_14400;
- ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS,
+ ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS,
¶meters, sizeof(parameters));
p->faxmode = 1;
parameters.request_response = AST_T38_REQUEST_TERMINATE;
parameters.max_ifp = ast_udptl_get_far_max_ifp(p->udptl);
parameters.rate = AST_T38_RATE_14400;
- ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS,
+ ast_queue_control_data(p->owner, AST_CONTROL_T38_PARAMETERS,
¶meters, sizeof(parameters));
}
p->faxmode = 0;
switch (cause) {
case OO_REASON_REMOTE_REJECTED:
return AST_CAUSE_CALL_REJECTED;
- case OO_REASON_NOUSER:
+ case OO_REASON_NOUSER:
return AST_CAUSE_UNALLOCATED;
case OO_REASON_REMOTE_BUSY:
case OO_REASON_LOCAL_BUSY:
return AST_CAUSE_CONGESTION;
case OO_REASON_REMOTE_NOANSWER:
return AST_CAUSE_NO_ANSWER;
- case OO_REASON_UNKNOWN:
+ case OO_REASON_UNKNOWN:
case OO_REASON_INVALIDMESSAGE:
case OO_REASON_TRANSPORTFAILURE:
return AST_CAUSE_FAILURE;
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/* Helper functions */
struct ooh323_user *find_user(const char * name, const char *ip);
struct ooh323_peer *find_peer(const char * name, int port);
-void ooh323_delete_peer(struct ooh323_peer *peer);
+void ooh323_delete_peer(struct ooh323_peer *peer);
int delete_users(void);
int delete_peers(void);
int restart_monitor(void);
int configure_local_rtp(struct ooh323_pvt *p, ooCallData* call);
-void setup_rtp_connection(ooCallData *call, const char *remoteIp,
+void setup_rtp_connection(ooCallData *call, const char *remoteIp,
int remotePort);
void close_rtp_connection(ooCallData *call);
struct ast_frame *ooh323_rtp_read
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "MP3 format [Any rate but 8000hz mono is optimal]");
-
Objective Open H.323 stack is a simple H.323 implementation in C. This
package contains the core stack code. For complete H.323 stack package with
examples or for more information visit www.obj-sys.com/open
- The ASN.1 messaging code was developed using the Objective Systems ASN1C
-compiler to implement the core H.323 specifications (H.225, H.235,
-and H.245). Additional code was then developed which makes use of
-the compiler generated code for presenting a comparatively high level
+ The ASN.1 messaging code was developed using the Objective Systems ASN1C
+compiler to implement the core H.323 specifications (H.225, H.235,
+and H.245). Additional code was then developed which makes use of
+the compiler generated code for presenting a comparatively high level
stack API.
Features
Features supported in this package include the following:
-* H.225/Q.931 - the following message types are supported (including
- support for FastStart and H.245 tunneling):
- - Setup
+* H.225/Q.931 - the following message types are supported (including
+ support for FastStart and H.245 tunneling):
+ - Setup
- Connect
- Call Proceeding
- - Alerting
+ - Alerting
- Facility
- ReleaseComplete
To run the stack test application chansetup
chansetup - This is a sample program developed for testing multiple calls.
This program allows stack testing by placing multiple calls. The number of
- calls, duration of each call and interval between successive calls are
- configurable.
+ calls, duration of each call and interval between successive calls are
+ configurable.
1. Two instances of this program have to be run. Can be run on same machine or
different machines.
cd tests/chansetup
-2. For running listener instance,
+2. For running listener instance,
./h323peer [--use-ip ip] [--use-port port]
- where local ip address and port can be specified for listening to incoming
+ where local ip address and port can be specified for listening to incoming
calls. By default, application determines ip address and uses default H323
port number 1720.
3. For running calling instance
-
+
./h323peer [--use-ip ip] -n <number of calls> -duration <call duration>
-interval <inetrval between successive calls> destination
-
+
where all times are in seconds. Interval of 0 means next call will be placed
after current call finishes. "destination" is the dotted ip address of the
endpoint running listener instance.
Reporting Problems:
-Report problems you encounter by sending E-mail to support@obj-sys.com.
+Report problems you encounter by sending E-mail to support@obj-sys.com.
If you have any further questions or comments on what you would like to
-see in the product or what is difficult to use or understand, please
+see in the product or what is difficult to use or understand, please
communicate them to us. Your feedback is important to us. Please let us
-know how it works out for you - either good or bad.
-
+know how it works out for you - either good or bad.
INCLUDES = -Ih323
-#include_HEADERS = ooUtils.h memheap.h ooCommon.h ooDateTime.h ooGkClient.h ooasn1.h oochannels.h ootrace.h ooh245.h ooports.h ooq931.h oohdr.h ooper.h ooSocket.h ooTimer.h ootypes.h eventHandler.h ooCapability.h ooCalls.h ooStackCmds.h ooh323.h ooh323ep.h printHandler.h rtctype.h h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.h
+#include_HEADERS = ooUtils.h memheap.h ooCommon.h ooDateTime.h ooGkClient.h ooasn1.h oochannels.h ootrace.h ooh245.h ooports.h ooq931.h oohdr.h ooper.h ooSocket.h ooTimer.h ootypes.h eventHandler.h ooCapability.h ooCalls.h ooStackCmds.h ooh323.h ooh323ep.h printHandler.h rtctype.h h323/H235-SECURITY-MESSAGES.h h323/H323-MESSAGES.h h323/MULTIMEDIA-SYSTEM-CONTROL.h
EXTRA_DIST = oostk.dsp
subdir = ooh323c/src
mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs
h323/MULTIMEDIA-SYSTEM-CONTROLDec.c
MULTIMEDIA-SYSTEM-CONTROLEnc.$(OBJEXT): \
h323/MULTIMEDIA-SYSTEM-CONTROLEnc.c
-libooh323c.a: $(libooh323c_a_OBJECTS) $(libooh323c_a_DEPENDENCIES)
+libooh323c.a: $(libooh323c_a_OBJECTS) $(libooh323c_a_DEPENDENCIES)
-rm -f libooh323c.a
$(libooh323c_a_AR) libooh323c.a $(libooh323c_a_OBJECTS) $(libooh323c_a_LIBADD)
$(RANLIB) libooh323c.a
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return ASN_OK;
}
-int initContextBuffer
+int initContextBuffer
(OOCTXT* pctxt, const ASN1OCTET* bufaddr, ASN1UINT bufsiz)
{
if (bufaddr == 0) {
/* dynamic buffer */
if (bufsiz == 0) bufsiz = ASN_K_ENCBUFSIZ;
- pctxt->buffer.data = (ASN1OCTET*)
+ pctxt->buffer.data = (ASN1OCTET*)
memHeapAlloc (&pctxt->pMsgMemHeap, bufsiz);
if (!pctxt->buffer.data) return ASN_E_NOMEM;
pctxt->buffer.size = bufsiz;
return ASN_OK;
}
-int initSubContext (OOCTXT* pctxt, OOCTXT* psrc)
+int initSubContext (OOCTXT* pctxt, OOCTXT* psrc)
{
/* ast_mutex_lock(&pctxt->pLock); */
int stat = ASN_OK;
ASN1BOOL saveBuf;
ast_mutex_lock(&pctxt->pLock);
saveBuf = (pctxt->flags & ASN1SAVEBUF) != 0;
-
+
if (pctxt->buffer.dynamic && pctxt->buffer.data) {
if (saveBuf) {
memHeapMarkSaved (&pctxt->pMsgMemHeap, pctxt->buffer.data, TRUE);
{
int stat;
ast_mutex_lock(&pTarget->pLock); ast_mutex_lock(&pSource->pLock);
- stat = initContextBuffer
+ stat = initContextBuffer
(pTarget, pSource->buffer.data, pSource->buffer.size);
if (ASN_OK == stat) {
ast_mutex_unlock(&pctxt->pLock);
if(stat != ASN_OK) return stat;
-
+
return ASN_OK;
}
-OOCTXT* newContext ()
+OOCTXT* newContext ()
{
/* OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT)); */
OOCTXT* pctxt = (OOCTXT*) malloc (sizeof(OOCTXT));
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#include "ooasn1.h"
-static int decode16BitConstrainedString
+static int decode16BitConstrainedString
(OOCTXT* pctxt, Asn116BitCharString* pString, Asn116BitCharSet* pCharSet);
-static int decodeOctets
+static int decodeOctets
(OOCTXT* pctxt, ASN1OCTET* pbuffer, ASN1UINT bufsiz, ASN1UINT nbits);
static int getComponentLength (OOCTXT* pctxt, ASN1UINT itemBits);
int decodeBits (OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT nbits)
-{
+{
unsigned char mask;
if (nbits == 0) {
pctxt->buffer.bitOffset -= nbits;
- *pvalue = ((pctxt->buffer.data[pctxt->buffer.byteIndex]) >>
+ *pvalue = ((pctxt->buffer.data[pctxt->buffer.byteIndex]) >>
pctxt->buffer.bitOffset) & ((1 << nbits) - 1);
return ASN_OK;
/* Check if buffer contains number of bits requested */
int nbytes = (((nbits - pctxt->buffer.bitOffset) + 7) / 8);
-
+
if ((pctxt->buffer.byteIndex + nbytes) >= pctxt->buffer.size) {
return LOG_ASN1ERR (pctxt, ASN_E_ENDOFBUF);
}
/* second read bytes from next byteIndex */
while (nbits >= 8) {
- *pvalue = (*pvalue << 8) |
+ *pvalue = (*pvalue << 8) |
(pctxt->buffer.data[pctxt->buffer.byteIndex]);
pctxt->buffer.byteIndex++;
nbits -= 8;
/* third read bits & set bitoffset of the byteIndex */
if (nbits > 0) {
pctxt->buffer.bitOffset = 8 - nbits;
- *pvalue = (*pvalue << nbits) |
- ((pctxt->buffer.data[pctxt->buffer.byteIndex]) >>
+ *pvalue = (*pvalue << nbits) |
+ ((pctxt->buffer.data[pctxt->buffer.byteIndex]) >>
pctxt->buffer.bitOffset);
}
}
}
-int decodeBitString
+int decodeBitString
(OOCTXT* pctxt, ASN1UINT* numbits_p, ASN1OCTET* buffer, ASN1UINT bufsiz)
{
ASN1UINT bitcnt;
if (bitcnt > 0) {
*numbits_p += bitcnt;
- stat = bitAndOctetStringAlignmentTest
+ stat = bitAndOctetStringAlignmentTest
(pSizeList, bitcnt, TRUE, &doAlign);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
return ASN_OK;
}
-int decodeBMPString
+int decodeBMPString
(OOCTXT* pctxt, ASN1BMPString* pvalue, Asn116BitCharSet* permCharSet)
{
Asn116BitCharSet charSet;
return ASN_OK;
}
-int decodeConstrainedStringEx
+int decodeConstrainedStringEx
(OOCTXT* pctxt, const char** string, const char* charSet,
ASN1UINT abits, ASN1UINT ubits, ASN1UINT canSetBits)
{
return ASN_OK;
}
-int decodeConsInteger
+int decodeConsInteger
(OOCTXT* pctxt, ASN1INT* pvalue, ASN1INT lower, ASN1INT upper)
-{
+{
ASN1UINT range_value = upper - lower;
ASN1UINT adjusted_value;
int stat = ASN_OK;
return stat;
}
-int decodeConsUInt8
+int decodeConsUInt8
(OOCTXT* pctxt, ASN1UINT8* pvalue, ASN1UINT lower, ASN1UINT upper)
-{
+{
ASN1UINT range_value, value;
ASN1UINT adjusted_value;
int stat = ASN_OK;
return stat;
}
-int decodeConsUInt16
+int decodeConsUInt16
(OOCTXT* pctxt, ASN1USINT* pvalue, ASN1UINT lower, ASN1UINT upper)
-{
+{
ASN1UINT range_value, value;
ASN1UINT adjusted_value;
int stat = ASN_OK;
return stat;
}
-int decodeConsUnsigned
+int decodeConsUnsigned
(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT lower, ASN1UINT upper)
-{
+{
ASN1UINT range_value;
ASN1UINT adjusted_value;
int stat = ASN_OK;
return stat;
}
-int decodeConsWholeNumber
+int decodeConsWholeNumber
(OOCTXT* pctxt, ASN1UINT* padjusted_value, ASN1UINT range_value)
-{
+{
ASN1UINT nocts, range_bitcnt;
int stat;
/* If "fast copy" option is not set (ASN1FATSCOPY) or if constructed,
* copy the bit string value into a dynamic memory buffer;
- * otherwise, store the pointer to the value in the decode
+ * otherwise, store the pointer to the value in the decode
* buffer in the data pointer argument. */
-
+
if (pctxt->flags & ASN1FASTCOPY) {
/* check is it possible to do optimized decoding */
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
stat = DECODEBIT (pctxt, &bit); /* read first bit of length determinant */
- if (bit == 1 && stat == ASN_OK)
+ if (bit == 1 && stat == ASN_OK)
stat = DECODEBIT (pctxt, &bit); /* read second bit */
pctxt->buffer.byteIndex = byteIndex; /* restore byte index */
/* if either first or second bit != 0 - not fragmented */
- if (bit == 0 && stat == ASN_OK) {
+ if (bit == 0 && stat == ASN_OK) {
ASN1UINT bitcnt;
-
+
stat = decodeLength (pctxt, &bitcnt);
if (stat != 0) return LOG_ASN1ERR (pctxt, stat);
stat = moveBitCursor (pctxt, bitcnt);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
}
- else
+ else
pBitStr->data = 0;
-
+
return stat;
}
}
}
nocts = (nbits + 7) / 8;
-
+
/* Allocate memory for the target string */
if (nocts > 0) {
ptmp = (ASN1OCTET*) ASN1MALLOC (pctxt, nocts);
if (0 == ptmp) return LOG_ASN1ERR (pctxt, ASN_E_NOMEM);
-
+
/* Call static bit string decode function */
stat = decodeBitString (pctxt, &pBitStr->numbits, ptmp, nocts);
/* If "fast copy" option is not set (ASN1FASTCOPY) or if constructed,
* copy the octet string value into a dynamic memory buffer;
- * otherwise, store the pointer to the value in the decode
+ * otherwise, store the pointer to the value in the decode
* buffer in the data pointer argument. */
if (pctxt->flags & ASN1FASTCOPY) {
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
stat = DECODEBIT (pctxt, &bit); /* read first bit of length determinant */
- if (bit == 1 && stat == ASN_OK)
+ if (bit == 1 && stat == ASN_OK)
stat = DECODEBIT (pctxt, &bit); /* read second bit */
pctxt->buffer.byteIndex = byteIndex; /* restore byte index */
/* if either first or second bit != 0 - not fragmented */
- if (bit == 0 && stat == ASN_OK) {
+ if (bit == 0 && stat == ASN_OK) {
ASN1UINT octcnt;
-
+
stat = decodeLength (pctxt, &octcnt);
if (stat != 0) return LOG_ASN1ERR (pctxt, stat);
stat = moveBitCursor (pctxt, octcnt * 8);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
}
- else
+ else
pOctStr->data = 0;
-
+
return stat;
}
}
-
+
nocts = getComponentLength (pctxt, 8);
if (nocts < 0) return LOG_ASN1ERR (pctxt, nocts);
if (j == 0) {
subid = pvalue->subid[0];
pvalue->subid[0] = ((subid / 40) >= 2) ? 2 : subid / 40;
- pvalue->subid[1] = (pvalue->subid[0] == 2) ?
+ pvalue->subid[1] = (pvalue->subid[0] == 2) ?
subid - 80 : subid % 40;
j = 2;
}
else j++;
}
else
- stat = ASN_E_INVOBJID;
+ stat = ASN_E_INVOBJID;
}
pvalue->numids = j;
return (stat);
}
-static int decodeOctets
+static int decodeOctets
(OOCTXT* pctxt, ASN1OCTET* pbuffer, ASN1UINT bufsiz, ASN1UINT nbits)
-{
+{
ASN1UINT nbytes = (nbits + 7) / 8 ;
ASN1UINT i = 0, j;
ASN1UINT rshift = pctxt->buffer.bitOffset;
/* Copy last partial byte */
if (nbits >= rshift) {
- pbuffer[i] =
+ pbuffer[i] =
pctxt->buffer.data[pctxt->buffer.byteIndex++] << lshift;
nbitsInLastOctet = nbits - rshift;
if (nbitsInLastOctet > 0) {
- pbuffer[i] |=
+ pbuffer[i] |=
pctxt->buffer.data[pctxt->buffer.byteIndex] >> rshift;
}
pctxt->buffer.bitOffset = 8 - nbitsInLastOctet;
}
else if (nbits > 0) { /* nbits < rshift */
- pbuffer[i] =
+ pbuffer[i] =
pctxt->buffer.data[pctxt->buffer.byteIndex] << lshift;
pctxt->buffer.bitOffset = rshift - nbits;
}
return ASN_OK;
}
-int decodeOctetString
+int decodeOctetString
(OOCTXT* pctxt, ASN1UINT* numocts_p, ASN1OCTET* buffer, ASN1UINT bufsiz)
{
ASN1UINT octcnt;
if (TRUE) {
ASN1BOOL doAlign;
- stat = bitAndOctetStringAlignmentTest
+ stat = bitAndOctetStringAlignmentTest
(pSizeList, octcnt, FALSE, &doAlign);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
}
}
- stat = decodeOctets (pctxt, &buffer[octidx],
+ stat = decodeOctets (pctxt, &buffer[octidx],
bufsiz - octidx, (octcnt * 8));
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
return ASN_OK;
}
-int decodeOpenType
+int decodeOpenType
(OOCTXT* pctxt, const ASN1OCTET** object_p2, ASN1UINT* numocts_p)
{
ASN1DynOctStr octStr;
stat = decodeLength (pctxt, &nbytes);
if (stat < 0) return LOG_ASN1ERR (pctxt, stat);
-
+
if (nbytes > 0) {
stat = decodeByteAlign (pctxt);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
}
int decodeSmallNonNegWholeNumber (OOCTXT* pctxt, ASN1UINT* pvalue)
-{
+{
ASN1BOOL bitValue;
ASN1UINT len;
int ret;
return ASN_OK;
}
-static int decode16BitConstrainedString
+static int decode16BitConstrainedString
(OOCTXT* pctxt, Asn116BitCharString* pString, Asn116BitCharSet* pCharSet)
{
ASN1UINT i, idx, nbits = pCharSet->alignedBits;
stat = decodeBits (pctxt, &idx, nbits);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
- pString->data[i] = (pCharSet->charSet.data == 0) ?
+ pString->data[i] = (pCharSet->charSet.data == 0) ?
idx + pCharSet->firstChar : pCharSet->charSet.data[idx];
}
}
if (pctxt->buffer.byteIndex > pctxt->buffer.size) {
return (ASN_E_ENDOFBUF);
}
-
+
return ASN_OK;
}
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
DListNode* dListAppend (OOCTXT* pctxt, DList* pList, void* pData)
{
- DListNode* pListNode = (DListNode*)
+ DListNode* pListNode = (DListNode*)
memAlloc (pctxt, sizeof(DListNode));
if (0 != pListNode) {
DListNode* dListAppendNode (OOCTXT* pctxt, DList* pList, void* pData)
{
- DListNode* pListNode =
+ DListNode* pListNode =
(DListNode*) (((char*)pData) - sizeof(DListNode));
if (0 != pListNode) {
for (pNode = pList->head; pNode != 0; pNode = pNextNode) {
pNextNode = pNode->next;
-
+
memFreePtr (pctxt, pNode->data);
memFreePtr (pctxt, pNode);
}
memFreePtr(pctxt, pNode);
}
}
-
-DListNode* dListFindByIndex (DList* pList, int index)
+
+DListNode* dListFindByIndex (DList* pList, int index)
{
DListNode* curNode;
int i;
/* Insert item before given node */
-DListNode* dListInsertBefore
+DListNode* dListInsertBefore
(OOCTXT* pctxt, DList* pList, DListNode* node, const void* pData)
{
DListNode* pListNode = (DListNode*) memAlloc (pctxt, sizeof(DListNode));
-
+
if (0 != pListNode) {
pListNode->data = (void*)pData;
/* Insert item after given node */
-DListNode* dListInsertAfter
+DListNode* dListInsertAfter
(OOCTXT* pctxt, DList* pList, DListNode* node, const void* pData)
{
DListNode* pListNode = (DListNode*) memAlloc (pctxt, sizeof(DListNode));
return pListNode;
}
-
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file dlist.h
+/**
+ * @file dlist.h
* Doubly-linked list structures and utility functions.
*/
#ifndef _OODLIST_H_
* @param pData A pointer to a data item to be appended to the list.
* @return A pointer to an allocated node structure used to link
* the given data value into the list.
- */
-EXTERN DListNode* dListAppend
+ */
+EXTERN DListNode* dListAppend
(struct OOCTXT* pctxt, DList* pList, void* pData);
-EXTERN DListNode* dListAppendNode
+EXTERN DListNode* dListAppendNode
(struct OOCTXT* pctxt, DList* pList, void* pData);
/**
- * This function delete the head item from the list and returns a pointer
- * the data item stored in that node. The memory for the node structure
+ * This function delete the head item from the list and returns a pointer
+ * the data item stored in that node. The memory for the node structure
* is released.
*
* @param pctxt A pointer to a context structure. This provides a
* storage area for the function to store all working
* variables that must be maintained between function
* calls.
- * @param pList A pointer to the linked list structure from which
+ * @param pList A pointer to the linked list structure from which
* the node will be deleted.
* @return A pointer to the data item stored in the deleted node.
- */
+ */
EXTERN void* dListDeleteHead (struct OOCTXT* pctxt, DList* pList);
EXTERN DListNode* dListFindByIndex (DList* pList, int index);
/**
* This function initializes a doubly linked list structure. It sets the number
* of elements to zero and sets all internal pointer values to NULL. A doubly
- * linked-list structure is described by the DList type. Nodes of the list
+ * linked-list structure is described by the DList type. Nodes of the list
* are of type DListNode.
*
* Memory for the structures is allocated using the memAlloc run-time
*/
EXTERN void dListFreeNodes (struct OOCTXT* pctxt, DList* pList);
-/**
+/**
* This function removes all nodes from the linked list structure and releases
* the memory that was allocated for storing the node structures
* (DListNode) and for data. The memory for data in each node must have
EXTERN void dListFreeAll (struct OOCTXT* pctxt, DList* pList);
/**
- * This function inserts an item into the linked list structure before the
+ * This function inserts an item into the linked list structure before the
* specified element.
- *
+ *
* @param pctxt Pointer to a context structure.
- * @param pList A pointer to a linked list structure into which the
+ * @param pList A pointer to a linked list structure into which the
* data item is to be inserted.
- * @param node The position in the list where the item is to be
- * inserted. The item will be inserted before this
+ * @param node The position in the list where the item is to be
+ * inserted. The item will be inserted before this
* node or appended to the list if node is null.
* @param pData A pointer to the data item to be inserted to the list.
- * @return A pointer to an allocated node structure used to
+ * @return A pointer to an allocated node structure used to
* link the given data value into the list.
*/
-EXTERN DListNode* dListInsertBefore
+EXTERN DListNode* dListInsertBefore
(struct OOCTXT* pctxt, DList* pList, DListNode* node, const void* pData);
/**
- * This function inserts an item into the linked list structure after the
+ * This function inserts an item into the linked list structure after the
* specified element.
- *
+ *
* @param pctxt Pointer to a context structure.
- * @param pList A pointer to a linked list structure into which the
+ * @param pList A pointer to a linked list structure into which the
* data item is to be inserted.
- * @param node The position in the list where the item is to be
- * inserted. The item will be inserted after this
+ * @param node The position in the list where the item is to be
+ * inserted. The item will be inserted after this
* node or added as the head element if node is null.
* @param pData A pointer to the data item to be inserted to the list.
- * @return A pointer to an allocated node structure used to
+ * @return A pointer to an allocated node structure used to
* link the given data value into the list.
*/
-EXTERN DListNode* dListInsertAfter
+EXTERN DListNode* dListInsertAfter
(struct OOCTXT* pctxt, DList* pList, DListNode* node, const void* pData);
/**
EXTERN void dListRemove (DList* pList, DListNode* node);
EXTERN void dListFindAndRemove(struct OOCTXT* pctxt, DList* pList, void* data);
-/**
+/**
* @}
*/
#ifdef __cplusplus
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#include "ooasn1.h"
-static int encode16BitConstrainedString
+static int encode16BitConstrainedString
(OOCTXT* pctxt, Asn116BitCharString value, Asn116BitCharSet* pCharSet);
static int encode2sCompBinInt (OOCTXT* pctxt, ASN1INT value);
int encodeBit (OOCTXT* pctxt, ASN1BOOL value)
-{
+{
int stat = ASN_OK;
/* If start of new byte, init to zero */
/* Set single-bit value */
if (value) {
- pctxt->buffer.data[pctxt->buffer.byteIndex] |=
+ pctxt->buffer.data[pctxt->buffer.byteIndex] |=
( 1 << pctxt->buffer.bitOffset );
}
}
int encodeBits (OOCTXT* pctxt, ASN1UINT value, ASN1UINT nbits)
-{
+{
int nbytes = (nbits + 7)/ 8, stat = ASN_OK;
if (nbits == 0) return stat;
if (nbits < (unsigned)pctxt->buffer.bitOffset) {
pctxt->buffer.bitOffset -= nbits;
- pctxt->buffer.data[pctxt->buffer.byteIndex] |=
+ pctxt->buffer.data[pctxt->buffer.byteIndex] |=
( value << pctxt->buffer.bitOffset );
return stat;
}
/* to set bits in subsequent bytes.. */
nbits -= pctxt->buffer.bitOffset;
- pctxt->buffer.data[pctxt->buffer.byteIndex++] |=
+ pctxt->buffer.data[pctxt->buffer.byteIndex++] |=
(ASN1OCTET)( value >> nbits );
- pctxt->buffer.data[pctxt->buffer.byteIndex] = 0;
+ pctxt->buffer.data[pctxt->buffer.byteIndex] = 0;
while (nbits >= 8) {
nbits -= 8;
- pctxt->buffer.data[pctxt->buffer.byteIndex++] =
+ pctxt->buffer.data[pctxt->buffer.byteIndex++] =
(ASN1OCTET)( value >> nbits );
- pctxt->buffer.data[pctxt->buffer.byteIndex] = 0;
+ pctxt->buffer.data[pctxt->buffer.byteIndex] = 0;
}
/* copy final partial byte */
pctxt->buffer.bitOffset = 8 - nbits;
if (nbits > 0) {
- pctxt->buffer.data[pctxt->buffer.byteIndex] =
+ pctxt->buffer.data[pctxt->buffer.byteIndex] =
(ASN1OCTET)((value & ((1 << nbits)-1)) << pctxt->buffer.bitOffset);
}
else
}
int encodeBitsFromOctet (OOCTXT* pctxt, ASN1OCTET value, ASN1UINT nbits)
-{
+{
int lshift = pctxt->buffer.bitOffset;
int rshift = 8 - pctxt->buffer.bitOffset;
int stat = ASN_OK;
- ASN1OCTET mask = 0x0;
+ ASN1OCTET mask = 0x0;
if (nbits == 0) return ASN_OK;
/* possibly some bits in the following octet.. */
else {
- pctxt->buffer.data[pctxt->buffer.byteIndex] |=
+ pctxt->buffer.data[pctxt->buffer.byteIndex] |=
(ASN1OCTET)(value >> rshift);
pctxt->buffer.bitOffset -= nbits;
if (pctxt->buffer.bitOffset < 0) {
pctxt->buffer.byteIndex++;
- pctxt->buffer.data[pctxt->buffer.byteIndex] =
+ pctxt->buffer.data[pctxt->buffer.byteIndex] =
(ASN1OCTET)(value << lshift);
pctxt->buffer.bitOffset += 8;
}
if (enclen > 0) {
ASN1BOOL doAlign;
- stat = bitAndOctetStringAlignmentTest
+ stat = bitAndOctetStringAlignmentTest
(pSizeList, numbits, TRUE, &doAlign);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
return ASN_OK;
}
-int encodeBMPString
+int encodeBMPString
(OOCTXT* pctxt, ASN1BMPString value, Asn116BitCharSet* permCharSet)
{
Asn116BitCharSet charSet;
return (stat);
}
-int encodeConsInteger
+int encodeConsInteger
(OOCTXT* pctxt, ASN1INT value, ASN1INT lower, ASN1INT upper)
-{
+{
ASN1UINT range_value;
ASN1UINT adjusted_value;
int stat;
else {
range_value = upper + abs(lower);
adjusted_value = value + abs(lower);
- }
+ }
if (range_value != ASN1UINT_MAX) { range_value += 1; }
return stat;
}
-int encodeConsUnsigned
+int encodeConsUnsigned
(OOCTXT* pctxt, ASN1UINT value, ASN1UINT lower, ASN1UINT upper)
-{
+{
ASN1UINT range_value;
ASN1UINT adjusted_value;
int stat;
return stat;
}
-int encodeConsWholeNumber
+int encodeConsWholeNumber
(OOCTXT* pctxt, ASN1UINT adjusted_value, ASN1UINT range_value)
-{
+{
ASN1UINT nocts, range_bitcnt = getUIntBitCount (range_value - 1);
int stat;
}
}
-int encodeConstrainedStringEx (OOCTXT* pctxt,
- const char* string,
+int encodeConstrainedStringEx (OOCTXT* pctxt,
+ const char* string,
const char* charSet,
ASN1UINT abits, /* aligned char bits */
ASN1UINT ubits, /* unaligned char bits */
pctxt->buffer.data = (ASN1OCTET*) memHeapRealloc
(&pctxt->pMsgMemHeap, pctxt->buffer.data, pctxt->buffer.size);
-
+
if (!pctxt->buffer.data) return (ASN_E_NOMEM);
return (ASN_OK);
return pctxt->buffer.data;
}
-int encodeIdent (OOCTXT* pctxt, ASN1UINT ident)
+int encodeIdent (OOCTXT* pctxt, ASN1UINT ident)
{
ASN1UINT mask;
int nshifts = 0, stat;
}
int encodeLength (OOCTXT* pctxt, ASN1UINT value)
-{
+{
ASN1BOOL extendable;
- Asn1SizeCnst* pSize =
+ Asn1SizeCnst* pSize =
checkSize (pctxt->pSizeConstraint, value, &extendable);
ASN1UINT lower = (pSize) ? pSize->lower : 0;
ASN1UINT upper = (pSize) ? pSize->upper : ASN1UINT_MAX;
/* within the range of any of them, signal constraint violation */
/* error.. */
- if (pctxt->pSizeConstraint && !pSize)
+ if (pctxt->pSizeConstraint && !pSize)
return LOG_ASN1ERR (pctxt, ASN_E_CONSVIO);
/* Reset the size constraint in the context block structure */
if (0 == pvalue) return LOG_ASN1ERR (pctxt, ASN_E_INVOBJID);
if (numids < 2) return LOG_ASN1ERR (pctxt, ASN_E_INVOBJID);
if (pvalue->subid[0] > 2) return LOG_ASN1ERR (pctxt, ASN_E_INVOBJID);
- if (pvalue->subid[0] != 2 && pvalue->subid[1] > 39)
+ if (pvalue->subid[0] != 2 && pvalue->subid[1] > 39)
return LOG_ASN1ERR (pctxt, ASN_E_INVOBJID);
/* Passed checks, encode object identifier */
-
+
/* Munge first two sub ID's and encode */
temp = ((pvalue->subid[0] * 40) + pvalue->subid[1]);
}
int encodebitsFromOctet (OOCTXT* pctxt, ASN1OCTET value, ASN1UINT nbits)
-{
+{
int lshift = pctxt->buffer.bitOffset;
int rshift = 8 - pctxt->buffer.bitOffset;
int stat = ASN_OK;
/* possibly some bits in the following octet.. */
else {
- pctxt->buffer.data[pctxt->buffer.byteIndex] |=
+ pctxt->buffer.data[pctxt->buffer.byteIndex] |=
(ASN1OCTET)(value >> rshift);
pctxt->buffer.bitOffset -= nbits;
if (pctxt->buffer.bitOffset < 0) {
pctxt->buffer.byteIndex++;
- pctxt->buffer.data[pctxt->buffer.byteIndex] =
+ pctxt->buffer.data[pctxt->buffer.byteIndex] =
(ASN1OCTET)(value << lshift);
pctxt->buffer.bitOffset += 8;
}
}
int encodeOctets (OOCTXT* pctxt, const ASN1OCTET* pvalue, ASN1UINT nbits)
-{
+{
int i = 0, stat;
int numFullOcts = nbits / 8;
/* encode buffer.. */
if (pctxt->buffer.bitOffset == 8) {
- memcpy (&pctxt->buffer.data[pctxt->buffer.byteIndex], pvalue,
+ memcpy (&pctxt->buffer.data[pctxt->buffer.byteIndex], pvalue,
numFullOcts);
pctxt->buffer.byteIndex += numFullOcts;
pctxt->buffer.data[pctxt->buffer.byteIndex] = 0;
if (enclen > 0) {
ASN1BOOL doAlign;
- stat = bitAndOctetStringAlignmentTest
+ stat = bitAndOctetStringAlignmentTest
(pSizeList, numocts, FALSE, &doAlign);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
stat = encodeByteAlign (pctxt);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
- stat = encodeOpenType
+ stat = encodeOpenType
(pctxt, pOpenType->numocts, pOpenType->data);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
if (lower > ASN1INT_MIN)
value -= lower;
-
+
/* Calculate signed number value length */
for ( ; shift > 0; shift -= 8) {
if ((stat = encodeLength (pctxt, nbytes)) < 0) {
return stat;
}
-
+
if ((stat = encodeByteAlign (pctxt)) != ASN_OK)
return stat;
-
+
/* Encode additional zero byte if necessary */
if (nbytes > sizeof(value)) {
}
int encodeSmallNonNegWholeNumber (OOCTXT* pctxt, ASN1UINT value)
-{
+{
int stat;
if (value < 64) {
return ASN_OK;
}
-static int encode16BitConstrainedString
+static int encode16BitConstrainedString
(OOCTXT* pctxt, Asn116BitCharString value, Asn116BitCharSet* pCharSet)
{
ASN1UINT i, pos;
for (i = 0; i < value.nchars; i++) {
if (pCharSet->charSet.data == 0) {
- stat = encodeBits
+ stat = encodeBits
(pctxt, value.data[i] - pCharSet->firstChar, nbits);
if (stat != ASN_OK) return LOG_ASN1ERR (pctxt, stat);
}
/* multiple of 8 bits and also satisifies the condition that the */
/* leading eight bits of the field shall not be zero unless the */
/* field is precisely 8 bits long. */
-
+
ASN1UINT bitcnt = (value == 0) ? 1 : getUIntBitCount (value);
/* round-up to nearest 8-bit boundary */
return enclen;
}
-static int getIdentByteCount (ASN1UINT ident)
+static int getIdentByteCount (ASN1UINT ident)
{
if (ident < (1u << 7)) { /* 7 */
return 1;
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
"Value constraint violation: field %s, value %s",
"Value range error: lower bound is greater than upper",
"Unexpected end of file detected",
- "Invalid UTF-8 character at index %d",
- "List error: concurrent modification attempt while iterating",
+ "Invalid UTF-8 character at index %d",
+ "List error: concurrent modification attempt while iterating",
"List error: illegal state for attempted operation",
"Array index out of bounds",
"Invalid parameter passed to function or method",
"Invalid time string format",
- "Context is not initialized",
- "ASN.1 value will not fit in target variable",
- "Character is not within the defined character set",
- "Invalid XML state for attempted operation",
- "Error condition returned from XML parser:\n%s",
+ "Context is not initialized",
+ "ASN.1 value will not fit in target variable",
+ "Character is not within the defined character set",
+ "Invalid XML state for attempted operation",
+ "Error condition returned from XML parser:\n%s",
"SEQUENCE elements not in correct order",
"Invalid index for table constraint identifier",
- "Invalid value for relational table constraint fixed type field",
- "File not found",
+ "Invalid value for relational table constraint fixed type field",
+ "File not found",
"File read error",
"File write error",
"Invalid Base64 string",
j = pcnt = 0;
tp = g_status_text[i];
- while (*tp)
+ while (*tp)
{
if (*tp == '%' && *(tp+1) == 's')
{
}
else
strcpy (bufp, "unrecognized completion status");
- }
+ }
else strcpy (bufp, "normal completion status");
return (bufp);
}
/* Get error text in a dynamic memory buffer. This allocates memory */
-/* using the 'memAlloc' function. This memory is automatically freed */
+/* using the 'memAlloc' function. This memory is automatically freed */
/* at the time the 'memFree' function is called. */
char* errGetText (OOCTXT* pctxt)
while (pctxt->errInfo.stkx > 0) {
pctxt->errInfo.stkx--;
- sprintf (lbuf, " Module: %s, Line %d\n",
+ sprintf (lbuf, " Module: %s, Line %d\n",
pctxt->errInfo.stack[pctxt->errInfo.stkx].module,
pctxt->errInfo.stack[pctxt->errInfo.stkx].lineno);
strcat(pBuf, lbuf);
printf ("Stack trace:");
while (pErrInfo->stkx > 0) {
pErrInfo->stkx--;
- printf (" Module: %s, Line %d\n",
+ printf (" Module: %s, Line %d\n",
pErrInfo->stack[pErrInfo->stkx].module,
pErrInfo->stack[pErrInfo->stkx].lineno);
}
for (i = 0; i < pSrcErrInfo->stkx; i++) {
if (pDestErrInfo->stkx < ASN_K_MAXERRSTK) {
- pDestErrInfo->stack[pDestErrInfo->stkx].module =
+ pDestErrInfo->stack[pDestErrInfo->stkx].module =
pSrcErrInfo->stack[i].module;
- pDestErrInfo->stack[pDestErrInfo->stkx++].lineno =
+ pDestErrInfo->stack[pDestErrInfo->stkx++].lineno =
pSrcErrInfo->stack[i].lineno;
}
}
}
-int errSetData (ASN1ErrInfo* pErrInfo, int status,
- const char* module, int lno)
-{
+int errSetData (ASN1ErrInfo* pErrInfo, int status,
+ const char* module, int lno)
+{
if (pErrInfo->status == 0) {
pErrInfo->status = status;
}
ooLogAsn1Error(status, module, lno);
- return status;
+ return status;
}
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
}
}
-void invokeBitStrValue (OOCTXT* pctxt, ASN1UINT numbits,
+void invokeBitStrValue (OOCTXT* pctxt, ASN1UINT numbits,
const ASN1OCTET* data)
{
if (0 != pctxt->pEventHandler) {
}
}
-void invokeOctStrValue (OOCTXT* pctxt, ASN1UINT numocts,
+void invokeOctStrValue (OOCTXT* pctxt, ASN1UINT numocts,
const ASN1OCTET* data)
{
if (0 != pctxt->pEventHandler) {
}
}
-void invokeCharStr16BitValue (OOCTXT* pctxt, ASN1UINT nchars,
+void invokeCharStr16BitValue (OOCTXT* pctxt, ASN1UINT nchars,
ASN116BITCHAR* data)
{
if (0 != pctxt->pEventHandler) {
}
}
-void invokeOpenTypeValue (OOCTXT* pctxt, ASN1UINT numocts,
+void invokeOpenTypeValue (OOCTXT* pctxt, ASN1UINT numocts,
const ASN1OCTET* data)
{
if (0 != pctxt->pEventHandler) {
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file eventHandler.h
- * C event handler structure. This structure holds event handler function
+ * @file eventHandler.h
+ * C event handler structure. This structure holds event handler function
* callbacks for use by the generated code.
*/
/**
/**
- * This is a function pointer for a callback function which is invoked
- * from within a decode function when an element of a SEQUENCE, SET,
+ * This is a function pointer for a callback function which is invoked
+ * from within a decode function when an element of a SEQUENCE, SET,
* SEQUENCE OF, SET OF, or CHOICE construct is parsed.
*
* @param name For SEQUENCE, SET, or CHOICE, this is the name of the
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function when parsing is complete on an element of a
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function when parsing is complete on an element of a
* SEQUENCE, SET, SEQUENCE OF, SET OF, or CHOICE construct.
*
* @param name For SEQUENCE, SET, or CHOICE, this is the name of the
/**
- * This is a function pointer for a callback function which is invoked from
+ * This is a function pointer for a callback function which is invoked from
* within a decode function when a value of the BOOLEAN ASN.1 type is parsed.
*
* @param value Parsed value.
typedef void (*BoolValue) (ASN1BOOL value);
/**
- * This is a function pointer for a callback function which is invoked from
+ * This is a function pointer for a callback function which is invoked from
* within a decode function when a value of the INTERGER ASN.1 type is parsed.
*
* @param value Parsed value.
typedef void (*IntValue) (ASN1INT value);
/**
- * This is a function pointer for a callback function which is invoked
- * from within a decode function when a value of the INTEGER ASN.1 type
- * is parsed. In this case, constraints on the integer value forced the
+ * This is a function pointer for a callback function which is invoked
+ * from within a decode function when a value of the INTEGER ASN.1 type
+ * is parsed. In this case, constraints on the integer value forced the
* use of unsigned integer C type to represent the value.
*
* @param value Parsed value.
typedef void (*UIntValue) (ASN1UINT value);
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function when a value of the BIT STRING ASN.1 type is
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function when a value of the BIT STRING ASN.1 type is
* parsed.
*
- * @param numbits - Number of bits in the parsed value.
- * @param data - Pointer to a byte array that contains the bit
+ * @param numbits - Number of bits in the parsed value.
+ * @param data - Pointer to a byte array that contains the bit
* string data.
* @return - none
- */
+ */
typedef void (*BitStrValue) (ASN1UINT numbits, const ASN1OCTET* data);
/**
- * This is a function pointer for a callback function which is invoked from
+ * This is a function pointer for a callback function which is invoked from
* within a decode function when a value of one of the OCTET STRING ASN.1 type
* is parsed.
*
typedef void (*OctStrValue) (ASN1UINT numocts, const ASN1OCTET* data) ;
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function when a value of one of the 8-bit ASN.1 character
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function when a value of one of the 8-bit ASN.1 character
* string types is parsed.
*
* @param value Null terminated character string value.
typedef void (*CharStrValue) (const char* value) ;
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function when a value of one of the 16-bit ASN.1 character
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function when a value of one of the 16-bit ASN.1 character
* string types is parsed.
*
* This is used for the ASN.1 BmpString type.
typedef void (*CharStrValue16Bit) (ASN1UINT nchars, ASN116BITCHAR* data) ;
/**
- * This is a function pointer for a callback function which is invoked from
+ * This is a function pointer for a callback function which is invoked from
* within a decode function when a value of the NULL ASN.1 type is parsed.
*
* @param - none
typedef void (*NullValue) (void) ;
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function whn a value the OBJECT IDENTIFIER ASN.1 type is
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function whn a value the OBJECT IDENTIFIER ASN.1 type is
* parsed.
*
* @param numSubIds Number of subidentifiers in the object identifier.
typedef void (*OidValue) (ASN1UINT numSubIds, ASN1UINT* pSubIds) ;
/**
- * This is a function pointer for a callback function which is invoked from
- * within a decode function when a value of the ENUMERATED ASN.1 type is
+ * This is a function pointer for a callback function which is invoked from
+ * within a decode function when a value of the ENUMERATED ASN.1 type is
* parsed.
*
* @param value - Parsed enumerated value
typedef void (*EnumValue) (ASN1UINT value) ;
/**
- * This is a function pointer for a callback function which is invoked from
+ * This is a function pointer for a callback function which is invoked from
* within a decode function when an ASN.1 open type is parsed.
*
* @param numocts Number of octets in the parsed value.
/**
- * This function sets the event handler object within the context. It
+ * This function sets the event handler object within the context. It
* will overwrite the definition of any handler that was set previously.
*
* @param pctxt Context to which event handler has to be added.
EXTERN void setEventHandler (OOCTXT* pctxt, EventHandler* pHandler);
/**
- * This function is called to remove the event handler current defined
- * in the context. This is done by setting the event handler object
+ * This function is called to remove the event handler current defined
+ * in the context. This is done by setting the event handler object
* pointer to NULL.
*
* @param pctxt Context from which event handler has to be removed.
EXTERN void removeEventHandler (OOCTXT* pctxt);
/**
- * The following functions are invoked from within the generated
+ * The following functions are invoked from within the generated
* code to call the various user-defined event handler methods ..
*/
EXTERN void invokeStartElement (OOCTXT* pctxt, const char* name, int index);
EXTERN void invokeIntValue (OOCTXT* pctxt, ASN1INT value);
EXTERN void invokeUIntValue (OOCTXT* pctxt, ASN1UINT value);
-EXTERN void invokeBitStrValue
+EXTERN void invokeBitStrValue
(OOCTXT* pctxt, ASN1UINT numbits, const ASN1OCTET* data);
-EXTERN void invokeOctStrValue
+EXTERN void invokeOctStrValue
(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data);
EXTERN void invokeCharStrValue (OOCTXT* pctxt, const char* value);
-EXTERN void invokeCharStr16BitValue
+EXTERN void invokeCharStr16BitValue
(OOCTXT* pctxt, ASN1UINT nchars, ASN116BITCHAR* data);
EXTERN void invokeNullValue (OOCTXT* pctxt);
-EXTERN void invokeOidValue
+EXTERN void invokeOidValue
(OOCTXT* pctxt, ASN1UINT numSubIds, ASN1UINT* pSubIds);
EXTERN void invokeEnumValue (OOCTXT* pctxt, ASN1UINT value);
-EXTERN void invokeOpenTypeValue
+EXTERN void invokeOpenTypeValue
(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
}
#endif
-#endif
+#endif
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
EXTERN const char* gs_H323_MESSAGES_AliasAddress_dialedDigits_CharSet =
"#*,0123456789";
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
EXTERN const char* gs_MULTIMEDIA_SYSTEM_CONTROL_UserInputIndication_signal_signalType_CharSet =
"!#*0123456789ABCD";
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return (stat);
}
-
/*
* Copyright (C) 1997-2004 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
ASN1UINT g_defBlkSize = XM_K_MEMBLKSIZ;
-static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
+static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
void* pMemBlk, int blockType);
typedef void OSMemElemDescr;
#define SET_FREE_ELEM(pMemBlk, pElem) setLastElem (pMemBlk, pElem)
/* Memory debugging macros */
-#define RTMEMDIAG1(msg)
-#define RTMEMDIAG2(msg,a)
+#define RTMEMDIAG1(msg)
+#define RTMEMDIAG2(msg,a)
#define RTMEMDIAG3(msg,a,b)
#define RTMEMDIAG4(msg,a,b,c)
#define FILLFREEMEM(mem,size)
-#define FILLNEWMEM(mem,size)
+#define FILLNEWMEM(mem,size)
#define CHECKMEMELEM(memblk,elem)
#define CHECKMEMBLOCK(memheap,memblk)
-#define CHECKMEMHEAP(memheap)
+#define CHECKMEMHEAP(memheap)
#define TRACEMEMELEM(memblk, elem, name)
#define TRACEFREE(memlink,name)
-static void setLastElem (OSMemBlk* pMemBlk, OSMemElemDescr* pElem)
+static void setLastElem (OSMemBlk* pMemBlk, OSMemElemDescr* pElem)
{
- if (pElem == 0) {
- pMemBlk->freeElemOff = 0;
- return;
+ if (pElem == 0) {
+ pMemBlk->freeElemOff = 0;
+ return;
}
- else if (ISLAST (pElem))
- return;
+ else if (ISLAST (pElem))
+ return;
else if (pMemBlk->freeElemOff > QOFFSETOF (pElem, pMemBlk->data) + 1) {
- pElem_nextFreeOff (pElem) = QOFFSETOF (GET_FREE_ELEM (pMemBlk), pElem);
- FORCE_SET_FREE_ELEM (pMemBlk, pElem);
- }
- else if (pMemBlk->freeElemOff == 0) {
- pElem_nextFreeOff (pElem) = 0;
- FORCE_SET_FREE_ELEM (pMemBlk, pElem);
- }
- else {
- SET_FREE (pElem);
- pElem_nextFreeOff (pElem) = 0;
+ pElem_nextFreeOff (pElem) = QOFFSETOF (GET_FREE_ELEM (pMemBlk), pElem);
+ FORCE_SET_FREE_ELEM (pMemBlk, pElem);
+ }
+ else if (pMemBlk->freeElemOff == 0) {
+ pElem_nextFreeOff (pElem) = 0;
+ FORCE_SET_FREE_ELEM (pMemBlk, pElem);
+ }
+ else {
+ SET_FREE (pElem);
+ pElem_nextFreeOff (pElem) = 0;
}
}
ppMemLink = &pMemHeap->phead;
/* if size is greater than 2**19, then allocate as RAW block */
-
+
if (nunits > (1<<16) - 2) {
void *data;
/* save size of the RAW memory block behind the pMemLink */
*(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = nbytes;
ast_mutex_unlock(&pMemHeap->pLock);
- return data;
+ return data;
}
-
+
RTMEMDIAG2 ("memHeapAlloc: adjusted nbytes = %d\n", nbytes);
/* Try to allocate a slot from an existing block on the list */
pElem_flags (pElem) = 0;
if (pMemBlk->lastElemOff != 0)
- pElem_prevOff (pElem) =
+ pElem_prevOff (pElem) =
(ASN1USINT)(pMemBlk->free_x - pMemBlk->lastElemOff + 1);
- else
+ else
pElem_prevOff (pElem) = 0;
-
+
pPrevElem = GET_LAST_ELEM (pMemBlk);
if (pPrevElem != 0)
CLEAR_LAST (pPrevElem);
-
- pElem_nunits (pElem) = (ASN1USINT)nunits;
+
+ pElem_nunits (pElem) = (ASN1USINT)nunits;
pElem_beginOff (pElem) = QOFFSETOF (pElem, pMemBlk->data);
pMemBlk->lastElemOff = (ASN1USINT)(pMemBlk->free_x + 1);
mem_p = (void*) (pElem_data (pElem));
-
+
/* sizeof (OSMemElemDescr) == 1 unit */
- pMemBlk->free_x += nunits + 1;
-
+ pMemBlk->free_x += nunits + 1;
+
SET_LAST_ELEM (pMemBlk, pElem);
-
+
FILLNEWMEM (mem_p, nunits * 8u);
TRACEMEMELEM(pMemBlk, pElem, "Allocated");
CHECKMEMELEM (pMemBlk, pElem);
if (0 == mem_p) {
for (pMemLink = *ppMemLink; pMemLink != 0; pMemLink = pMemLink->pnext) {
if (pMemLink->blockType & RTMEMRAW) continue;
-
+
pMemBlk = (OSMemBlk*) pMemLink->pMemBlk;
if (nunits <= (ASN1UINT)pMemBlk->freeMem) {
OSMemElemDescr* pElem = GET_FREE_ELEM(pMemBlk), *pPrevFree = 0;
- RTMEMDIAG2
- ("memHeapAlloc: try to reuse empty elems in pMemBlk = 0x%x...\n",
+ RTMEMDIAG2
+ ("memHeapAlloc: try to reuse empty elems in pMemBlk = 0x%x...\n",
pMemBlk);
while (pElem != 0) {
- if (ISFREE (pElem)) {
+ if (ISFREE (pElem)) {
if (nunits <= (ASN1UINT)pElem_nunits (pElem)) {
- RTMEMDIAG3
+ RTMEMDIAG3
("memHeapAlloc: "
- "found an exisiting free element 0x%x, size %d\n",
+ "found an exisiting free element 0x%x, size %d\n",
pElem, (pElem_nunits (pElem) * 8u));
-
- if (pMemBlk->freeElemOff ==
- QOFFSETOF (pElem, pMemBlk->data) + 1)
+
+ if (pMemBlk->freeElemOff ==
+ QOFFSETOF (pElem, pMemBlk->data) + 1)
{
-
+
/* modify the pMemBlk->freeElemOff value if necsry */
OSMemElemDescr* nextFree = GET_NEXT_FREE (pElem);
- FORCE_SET_FREE_ELEM (pMemBlk, nextFree);
+ FORCE_SET_FREE_ELEM (pMemBlk, nextFree);
}
else if (pPrevFree != 0) {
OSMemElemDescr* pNextFree = GET_NEXT_FREE (pElem);
if (pNextFree != 0)
- pElem_nextFreeOff (pPrevFree) = QOFFSETOF (pNextFree,
+ pElem_nextFreeOff (pPrevFree) = QOFFSETOF (pNextFree,
pPrevFree);
else
pElem_nextFreeOff (pPrevFree) = 0;
- }
+ }
CLEAR_FREE (pElem);
/* set beginOff value */
pElem_beginOff (pElem) = QOFFSETOF (pElem, pMemBlk->data);
-
+
pMemBlk->freeMem -= pElem_nunits (pElem);
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMBLOCK (pMemHeap, pMemBlk);
-
- mem_p = memHeapRealloc
+
+ mem_p = memHeapRealloc
(ppvMemHeap, pElem_data (pElem), nunits * 8u);
if (mem_p != 0) {
FILLNEWMEM (mem_p, nunits * 8u);
}
if (mem_p != 0) break;
}
- }
+ }
}
/* If not successful, malloc a new block and alloc from it */
RTMEMDIAG1 ("memHeapAlloc: alloc block..\n");
- allocSize = (ASN1UINT) ((((ASN1UINT)nunits) * 8u) +
+ allocSize = (ASN1UINT) ((((ASN1UINT)nunits) * 8u) +
sizeof (OSMemBlk) + sizeof_OSMemElemDescr);
- allocSize = (ASN1UINT) (allocSize < defBlkSize) ? defBlkSize :
+ allocSize = (ASN1UINT) (allocSize < defBlkSize) ? defBlkSize :
((allocSize + defBlkSize - 1) / defBlkSize * defBlkSize);
dataUnits = (ASN1UINT)((allocSize - sizeof (OSMemBlk)) >> 3u);
if (dataUnits >= (1u<<16)) {
dataUnits = (ASN1UINT)((1u<<16) - 1);
allocSize = (ASN1UINT)
((((ASN1UINT)dataUnits) * 8u) + sizeof (OSMemBlk));
- }
+ }
pmem = (ASN1OCTET*) malloc (allocSize + sizeof (OSMemLink));
if (0 != pmem) {
pElem_beginOff (pElem) = QOFFSETOF (pElem, pMemBlk->data);
/* sizeof (OSMemElemDescr) == 1 unit */
- pMemBlk->free_x = (ASN1USINT)(nunits + 1);
+ pMemBlk->free_x = (ASN1USINT)(nunits + 1);
pMemBlk->freeMem = 0;
pMemBlk->nunits = (ASN1USINT)dataUnits;
pMemBlk->freeElemOff = 0;
pMemBlk->nsaved = 0;
- if (memHeapAddBlock (ppMemLink, pMemBlk, RTMEMSTD | RTMEMLINK) == 0)
+ if (memHeapAddBlock (ppMemLink, pMemBlk, RTMEMSTD | RTMEMLINK) == 0)
{
free (pmem);
ast_mutex_unlock(&pMemHeap->pLock);
}
RTMEMDIAG2 ("memHeapAlloc: pMemBlk = 0x%x\n", pMemBlk);
RTMEMDIAG2 ("memHeapAlloc: pMemBlk->free_x = %d\n", pMemBlk->free_x);
- RTMEMDIAG2 ("memHeapAlloc: pMemBlk->size = %d\n",
+ RTMEMDIAG2 ("memHeapAlloc: pMemBlk->size = %d\n",
pMemBlk->nunits * 8u);
RTMEMDIAG2 ("memHeapAlloc: mem_p = 0x%x\n", mem_p);
RTMEMDIAG2 ("memHeapAlloc: sizeof (short) = %d\n", sizeof(short));
return ptr;
}
-void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
+void memHeapFreePtr (void** ppvMemHeap, void* mem_p)
{
OSMemHeap* pMemHeap;
OSMemLink** ppMemLink;
for (pMemLink = *ppMemLink; pMemLink != 0; pMemLink = pMemLink->pnextRaw) {
if ((pMemLink->blockType & RTMEMRAW) &&
- pMemLink->pMemBlk == mem_p)
+ pMemLink->pMemBlk == mem_p)
{
if(pMemLink->pnext != 0) {
pMemLink->pnext->pprev = pMemLink->pprev;
}
if (pPrevMemLink != 0)
pPrevMemLink->pnextRaw = pMemLink->pnextRaw;
- else if (*ppMemLink != 0 && (*ppMemLink)->pnextRaw == 0 &&
+ else if (*ppMemLink != 0 && (*ppMemLink)->pnextRaw == 0 &&
*ppMemLink != pMemLink->pnextRaw)
{
(*ppMemLink)->pnextRaw = pMemLink->pnextRaw;
}
- if ((pMemLink->blockType & RTMEMLINK) &&
+ if ((pMemLink->blockType & RTMEMLINK) &&
(pMemLink->blockType & RTMEMMALLOC))
{
free (pMemLink);
RTMEMDIAG2 ("memHeapFreePtr: "
"the element 0x%x is already freed!\n", pElem);
ast_mutex_unlock(&pMemHeap->pLock);
- return;
+ return;
}
if (ISSAVED (pElem)) {
CHECKMEMBLOCK(pMemHeap, pMemBlk);
RTMEMDIAG2 ("memHeapFreePtr: pMemBlk = 0x%x\n", pMemBlk);
- RTMEMDIAG2 ("memHeapFreePtr: pMemBlk->size = %d\n",
+ RTMEMDIAG2 ("memHeapFreePtr: pMemBlk->size = %d\n",
pMemBlk->nunits * 8u);
if (ISLAST (pElem)) { /* is it the last? */
OSMemElemDescr* pPrevElem = GETPREV (pElem);
-
+
CHECKMEMELEM (pMemBlk, pPrevElem);
pMemBlk->free_x -= (pElem_nunits (pElem) + 1);
- FILLFREEMEM (&pMemBlk->data [pMemBlk->free_x * 8u],
+ FILLFREEMEM (&pMemBlk->data [pMemBlk->free_x * 8u],
(pElem_nunits (pElem) + 1) * 8u);
if (pPrevElem != 0 && ISFREE (pPrevElem)) {
pMemBlk->free_x -= (pElem_nunits (pPrevElem) + 1);
pMemBlk->freeMem -= pElem_nunits (pPrevElem);
SET_LAST_ELEM (pMemBlk, GETPREV (pPrevElem));
-
+
/* wasn't it the last elem in block? */
- if (pMemBlk->lastElemOff != 0) {
-
+ if (pMemBlk->lastElemOff != 0) {
+
/* correct nextFreeOff for previous free element */
pFreeElem = GET_FREE_ELEM (pMemBlk);
}
else {
OSMemElemDescr* pNextFree = 0;
-
+
while (pFreeElem < pPrevElem) {
pNextFree = pFreeElem;
pFreeElem = GET_NEXT_FREE (pFreeElem);
SET_LAST_ELEM (pMemBlk, pPrevElem);
}
- RTMEMDIAG2 ("memHeapFreePtr: pMemBlk->free_x = %d\n",
+ RTMEMDIAG2 ("memHeapFreePtr: pMemBlk->free_x = %d\n",
pMemBlk->free_x);
/* The question is: do we really want to get rid of the */
/* block or should we keep it around for reuse? */
if (pMemBlk->lastElemOff == 0) { /* was it the last elem in block? */
-
+
if ((pMemHeap->flags & RT_MH_DONTKEEPFREE) ||
- (pMemHeap->keepFreeUnits > 0 &&
+ (pMemHeap->keepFreeUnits > 0 &&
pMemHeap->freeUnits + pMemBlk->nunits > pMemHeap->keepFreeUnits))
{
ASN1OCTET blockType = pMemBlk->plink->blockType;
pMemBlk->plink->pprev->pnext = pMemBlk->plink->pnext;
}
else { /* head */
- if (pMemBlk->plink->pnext != 0 &&
+ if (pMemBlk->plink->pnext != 0 &&
!(pMemBlk->plink->pnext->blockType & RTMEMRAW))
{
pMemBlk->plink->pnext->pnextRaw = (*ppMemLink)->pnextRaw;
}
FILLFREEMEM (pMemBlk->plink, sizeof (*pMemBlk->plink));
FILLFREEMEM (pMemBlk->data, (pMemBlk->nunits * 8u));
-
+
free (pMemBlk->plink);
-
+
if (!(blockType & RTMEMLINK)) {
FILLFREEMEM (pMemBlk, sizeof (*pMemBlk));
free (pMemBlk);
}
- RTMEMDIAG2 ("memHeapFreePtr: pMemBlk = 0x%x was freed\n",
+ RTMEMDIAG2 ("memHeapFreePtr: pMemBlk = 0x%x was freed\n",
pMemBlk);
}
else {
}
else {
SET_LAST (GET_LAST_ELEM (pMemBlk));
- FILLFREEMEM (((char*) &pMemBlk->data[0]) + (pMemBlk->free_x * 8u),
+ FILLFREEMEM (((char*) &pMemBlk->data[0]) + (pMemBlk->free_x * 8u),
(pMemBlk->nunits - pMemBlk->free_x) * 8u);
CHECKMEMBLOCK (pMemHeap, pMemBlk);
}
SET_FREE_ELEM(pMemBlk, pElem);
pMemBlk->freeMem += pElem_nunits (pElem);
- RTMEMDIAG2 ("memHeapFreePtr: element 0x%x marked as free.\n",
+ RTMEMDIAG2 ("memHeapFreePtr: element 0x%x marked as free.\n",
pElem);
/* try to unite free blocks, if possible */
if (!ISFIRST (pElem)) {
if (ISFREE (GETPREV (pElem))) {
OSMemElemDescr* prevelem_p = GETPREV (pElem);
-
+
/* +1 because the OSMemElemDescr has size ONE unit (8 bytes) */
- pElem_nunits (prevelem_p) += pElem_nunits (pElem) + 1;
+ pElem_nunits (prevelem_p) += pElem_nunits (pElem) + 1;
pElem = prevelem_p;
pMemBlk->freeMem ++; /* sizeof (OSMemElemDescr) == 1 unit */
}
else {
/* look for nearest previous free block to correct nextFreeOff */
-
+
OSMemElemDescr* prevelem_p = pElem;
-
+
do {
prevelem_p = GETPREV (prevelem_p);
}
if (prevelem_p != 0) {
OSMemElemDescr* pNextFree = GET_NEXT_FREE (prevelem_p);
- if (pNextFree != 0)
+ if (pNextFree != 0)
pElem_nextFreeOff (pElem) = QOFFSETOF (pNextFree, pElem);
else
pElem_nextFreeOff (pElem) = 0;
pElem_nextFreeOff (prevelem_p) = QOFFSETOF (pElem, prevelem_p);
-
+
CHECKMEMELEM (pMemBlk, prevelem_p);
}
}
}
if (!ISLAST (pElem) && ISFREE (GETNEXT (pElem))) {
OSMemElemDescr* nextelem_p = GETNEXT (pElem);
-
+
/* +1 because the OSMemElemDescr has size ONE unit (8 bytes) */
- pElem_nunits (pElem) += pElem_nunits (nextelem_p) + 1;
+ pElem_nunits (pElem) += pElem_nunits (nextelem_p) + 1;
if (pElem_nextFreeOff (nextelem_p) == 0)
pElem_nextFreeOff (pElem) = 0;
else
- pElem_nextFreeOff (pElem) =
+ pElem_nextFreeOff (pElem) =
QOFFSETOF (GET_NEXT_FREE (nextelem_p), pElem);
pMemBlk->freeMem ++;
}
/* correct the prevOff field of next element */
- if (!ISLAST (pElem)) {
+ if (!ISLAST (pElem)) {
OSMemElemDescr* nextelem_p = GETNEXT (pElem);
pElem_prevOff (nextelem_p) = QOFFSETOF (nextelem_p, pElem);
}
CHECKMEMBLOCK (pMemHeap, pMemBlk);
}
ast_mutex_unlock(&pMemHeap->pLock);
-}
+}
-static void initNewFreeElement (OSMemBlk* pMemBlk,
- OSMemElemDescr* pNewElem, OSMemElemDescr* pElem)
+static void initNewFreeElement (OSMemBlk* pMemBlk,
+ OSMemElemDescr* pNewElem, OSMemElemDescr* pElem)
{
OSMemElemDescr *pNextElem, *pPrevElem = 0;
pElem_prevOff (pNewElem) = QOFFSETOF (pNewElem, pElem);
- if (pMemBlk->freeElemOff != 0 &&
+ if (pMemBlk->freeElemOff != 0 &&
pMemBlk->freeElemOff < QOFFSETOF (pElem, pMemBlk->data) + 1)
{
/* look for nearest previous free block to correct its nextFreeOff */
-
+
pPrevElem = pElem;
do {
if (pPrevElem != 0) { /* if it is not first free element... */
/* correct nextFreeOff for prev free element */
-
+
pElem_nextFreeOff (pPrevElem) = QOFFSETOF (pNewElem, pPrevElem);
}
else { /* if it is first free element in the block */
FORCE_SET_FREE_ELEM (pMemBlk, pNewElem);
}
-
+
pNextElem = GETNEXT (pNewElem);
if (ISFREE (pNextElem)) {
-
+
/* if the next elem is free, then unite them together */
pElem_nunits (pNewElem) += pElem_nunits (pNextElem) + 1;
if (pElem_nextFreeOff (pNextElem) != 0)
- pElem_nextFreeOff (pNewElem) = QOFFSETOF (GET_NEXT_FREE (pNextElem),
+ pElem_nextFreeOff (pNewElem) = QOFFSETOF (GET_NEXT_FREE (pNextElem),
pNewElem);
else
pElem_nextFreeOff (pNewElem) = 0;
pNextElem = GETNEXT (pNextElem);
/* set nextFreeOff for new element */
-
+
if (pNextElem != 0)
pElem_nextFreeOff (pNewElem) = QOFFSETOF (pNextElem, pNewElem);
else
for (pMemLink = *ppMemLink; pMemLink != 0; pMemLink = pMemLink->pnextRaw) {
if ((pMemLink->blockType & RTMEMRAW) &&
- pMemLink->pMemBlk == mem_p)
+ pMemLink->pMemBlk == mem_p)
{
if (pMemLink->blockType & RTMEMMALLOC) {
void *newMemBlk = realloc (pMemLink->pMemBlk, nbytes_);
- if (newMemBlk == 0)
+ if (newMemBlk == 0)
return 0;
pMemLink->pMemBlk = newMemBlk;
}
- else
+ else
return 0;
*(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = nbytes_;
return pMemLink->pMemBlk;
pElem = (OSMemElemDescr*) (((char*)mem_p) - sizeof_OSMemElemDescr);
- RTMEMDIAG3 ("memHeapRealloc: mem_p = 0x%x, old size = %d,", mem_p,
+ RTMEMDIAG3 ("memHeapRealloc: mem_p = 0x%x, old size = %d,", mem_p,
pElem_nunits (pElem) * 8u);
RTMEMDIAG2 (" new nbytes = %d\n", nbytes);
CHECKMEMBLOCK(pMemHeap, pMemBlk);
if ((unsigned)pElem_nunits (pElem) < nunits) { /* expanding */
-
+
if (nunits - pElem_nunits (pElem) <= (unsigned)pMemBlk->nunits) {
/* Try to expand the existing element in the existing block */
if (ISLAST (pElem)) { /* if the last element in the block */
-
+
/* if the free space in the block is enough */
-
- if ((int)(nunits - pElem_nunits (pElem)) <=
- (int)(pMemBlk->nunits - pMemBlk->free_x))
- {
+
+ if ((int)(nunits - pElem_nunits (pElem)) <=
+ (int)(pMemBlk->nunits - pMemBlk->free_x))
+ {
pMemBlk->free_x += nunits - pElem_nunits (pElem);
pElem_nunits (pElem) = (ASN1USINT)nunits;
RTMEMDIAG1 ("memHeapRealloc: "
"memory element is expanded.\n");
-
- FILLNEWMEM (&pMemBlk->data [(pMemBlk->free_x -
- (nunits - pElem_nunits (pElem))) * 8u],
+
+ FILLNEWMEM (&pMemBlk->data [(pMemBlk->free_x -
+ (nunits - pElem_nunits (pElem))) * 8u],
(nunits - pElem_nunits (pElem)) * 8u);
-
+
TRACEMEMELEM (pMemBlk, pElem, "Reallocated");
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMBLOCK (pMemHeap, pMemBlk);
return (mem_p);
- }
+ }
}
else {
- OSMemElemDescr* pNextElem, *pFreeElem;
+ OSMemElemDescr* pNextElem, *pFreeElem;
unsigned sumSize = pElem_nunits (pElem), freeMem = 0;
-
+
RTMEMDIAG1 ("memHeapRealloc: look for free element after "
"current block.\n");
pNextElem = GETNEXT (pElem);
if (ISFREE (pNextElem)) {
/* +1 'cos sizeof (OSMemElemDescr) == 1 unit */
- sumSize += pElem_nunits (pNextElem) + 1;
+ sumSize += pElem_nunits (pNextElem) + 1;
freeMem++;
}
-
+
if (sumSize >= nunits) {
RTMEMDIAG1 ("memHeapRealloc: reuse free element.\n");
FORCE_SET_FREE_ELEM (pMemBlk, GET_NEXT_FREE (pNextElem));
}
else if (pFreeElem < pElem) {
-
+
/* look for previous free elem to correct nextFreeOff */
for (; pFreeElem != 0 && pFreeElem < pNextElem;) {
- OSMemElemDescr* pNextFreeElem =
+ OSMemElemDescr* pNextFreeElem =
GET_NEXT_FREE (pFreeElem);
if (pNextFreeElem == pNextElem) {
if (pElem_nextFreeOff (pNextElem) != 0)
- pElem_nextFreeOff (pFreeElem) = QOFFSETOF
+ pElem_nextFreeOff (pFreeElem) = QOFFSETOF
(GET_NEXT_FREE (pNextElem), pFreeElem);
else
pElem_nextFreeOff (pFreeElem) = 0;
}
/* reuse empty elements after the pElem */
-
+
pMemBlk->freeMem += freeMem;
-
+
if (sumSize - nunits > 1) {
OSMemElemDescr* pNewElem;
-
+
/* if sumSize is too large, then create new empty element */
- pNewElem = (OSMemElemDescr*)
+ pNewElem = (OSMemElemDescr*)
(pElem_data (pElem) + nbytes);
pElem_nunits (pNewElem) = (ASN1USINT)(sumSize - nunits - 1);
if (pNextElem != 0)
pElem_prevOff (pNextElem) = QOFFSETOF (pNextElem, pElem);
}
-
+
TRACEMEMELEM (pMemBlk, pElem, "Reallocated");
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMELEM (pMemBlk, (!ISLAST (pElem)) ? GETNEXT (pElem) : 0);
CHECKMEMHEAP (pMemHeap);
newMem_p = memHeapAlloc (ppvMemHeap, nbytes);
-
+
if (newMem_p == 0)
return 0;
/* if the old memory block is marked as saved then mark the new block
as saved as well. */
- if (ISSAVED (pElem))
+ if (ISSAVED (pElem))
memHeapMarkSaved (ppvMemHeap, newMem_p, TRUE);
CHECKMEMHEAP (pMemHeap);
}
else { /* shrinking */
RTMEMDIAG1 ("memHeapRealloc: shrinking ...\n");
-
+
/* just free the pointer, if nbytes == 0 */
if (nbytes == 0) {
/* do not shrink, if size diff is too small */
/* sizeof (OSMemElemDescr) == 1 unit */
- if (pElem_nunits (pElem) - nunits > 1) {
-
- /* if it is the last element in the block, then just change the size
+ if (pElem_nunits (pElem) - nunits > 1) {
+
+ /* if it is the last element in the block, then just change the size
and free_x. */
if (ISLAST (pElem)) {
pMemBlk->free_x -= (pElem_nunits (pElem) - nunits);
- FILLFREEMEM (&pMemBlk->data [pMemBlk->free_x * 8u],
+ FILLFREEMEM (&pMemBlk->data [pMemBlk->free_x * 8u],
(pElem_nunits (pElem) - nunits) * 8u);
}
else {
pNewElem = (OSMemElemDescr*) (pElem_data (pElem) + nbytes);
/* sizeof (OSMemElemDescr) == 1 unit */
- pElem_nunits (pNewElem) = (ASN1USINT)(pElem_nunits (pElem) - nunits - 1);
-
+ pElem_nunits (pNewElem) = (ASN1USINT)(pElem_nunits (pElem) - nunits - 1);
+
initNewFreeElement (pMemBlk, pNewElem, pElem);
-
+
pMemBlk->freeMem += (pElem_nunits (pElem) - nunits) - 1;
}
pElem_nunits (pElem) = (ASN1USINT)nunits;
-
+
TRACEMEMELEM (pMemBlk, pElem, "Reallocated");
CHECKMEMELEM (pMemBlk, pElem);
CHECKMEMELEM (pMemBlk, (!ISLAST (pElem)) ? GETNEXT (pElem) : pElem);
pMemLink2 = pMemLink;
pMemLink = pMemLink2->pnext;
- RTMEMDIAG3 ("memHeapFreeAll: pMemLink2 = 0x%x, pMemLink = 0x%x\n",
+ RTMEMDIAG3 ("memHeapFreeAll: pMemLink2 = 0x%x, pMemLink = 0x%x\n",
pMemLink2, pMemLink);
-
+
#ifdef _MEMDEBUG
if (pMemLink2->blockType & RTMEMSTD) {
OSMemBlk* pMemBlk = (OSMemBlk*) pMemLink2->pMemBlk;
/* free link and block */
- if (((pMemLink2->blockType & RTMEMSTD) ||
+ if (((pMemLink2->blockType & RTMEMSTD) ||
(pMemLink2->blockType & RTMEMMALLOC)) &&
- !(pMemLink2->blockType & RTMEMLINK))
+ !(pMemLink2->blockType & RTMEMLINK))
free (pMemLink2->pMemBlk);
free (pMemLink2);
}
/* This function is used for marking memory block as "saved". It means
* that the memory block containing the specified memory pointer won't be
- * freed after calls to memHeapFreeAll/memHeapReset. User is responsible
+ * freed after calls to memHeapFreeAll/memHeapReset. User is responsible
* for freeing the marked memory block by call to memFreeBlock */
-void* memHeapMarkSaved (void** ppvMemHeap, const void* mem_p,
- ASN1BOOL saved)
+void* memHeapMarkSaved (void** ppvMemHeap, const void* mem_p,
+ ASN1BOOL saved)
{
OSMemHeap* pMemHeap;
OSMemLink* pMemLink;
RTMEMDIAG2 ("memHeapMarkSaved: for mem_p = 0x%x\n", mem_p);
- if (ppvMemHeap == 0 || *ppvMemHeap == 0 || mem_p == 0)
+ if (ppvMemHeap == 0 || *ppvMemHeap == 0 || mem_p == 0)
return 0;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
for (; pMemLink != 0; pMemLink = pMemLink->pnextRaw) {
if ((pMemLink->blockType & RTMEMRAW) &&
- pMemLink->pMemBlk == mem_p)
+ pMemLink->pMemBlk == mem_p)
{
break;
}
"already free!\n", pElem);
ast_mutex_unlock(&pMemHeap->pLock);
- return 0;
+ return 0;
}
if ((ISSAVED (pElem) && !saved) || (!ISSAVED (pElem) && saved)) {
pMemLink = pMemBlk->plink;
- if (saved)
+ if (saved)
SET_SAVED (pMemBlk, pElem);
else
CLEAR_SAVED (pMemBlk, pElem);
ast_mutex_unlock(&pMemHeap->pLock);
return 0;
}
- if (saved && nsaved > 0)
+ if (saved && nsaved > 0)
pMemLink->blockType |= RTMEMSAVED;
else if (nsaved == 0)
pMemLink->blockType &= (~RTMEMSAVED);
/* add memory block to list */
-static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
+static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink,
void* pMemBlk, int blockType)
{
OSMemLink* pMemLink;
- /* if pMemBlk has RTMEMLINK flags it means that it is allocated
+ /* if pMemBlk has RTMEMLINK flags it means that it is allocated
* cooperatively with OSMemLink, and we don't need to do additional
* allocations for it. Just use pointer's arithemtic. */
- if (blockType & RTMEMLINK)
+ if (blockType & RTMEMLINK)
pMemLink = (OSMemLink*) (((ASN1OCTET*)pMemBlk) - sizeof (OSMemLink));
else {
pMemLink = (OSMemLink*) malloc (
to perform rtMemRealloc through malloc/memcpy/free */
*(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = (int)-1;
}
- if (pMemLink == NULL)
+ if (pMemLink == NULL)
return NULL;
pMemLink->blockType = (ASN1OCTET)blockType;
pMemLink->pMemBlk = pMemBlk;
pMemLink->pnextRaw = 0;
}
- *ppMemLink = pMemLink;
+ *ppMemLink = pMemLink;
if (pMemLink->pnext != 0)
pMemLink->pnext->pprev = pMemLink;
((OSMemBlk*)pMemBlk)->plink = pMemLink; /*!AB */
RTMEMDIAG2 ("memHeapAddBlock: pMemLink = 0x%x\n", pMemLink);
- RTMEMDIAG2 ("memHeapAddBlock: pMemLink->pnext = 0x%x\n",
+ RTMEMDIAG2 ("memHeapAddBlock: pMemLink->pnext = 0x%x\n",
pMemLink->pnext);
- RTMEMDIAG2 ("memHeapAddBlock: pMemLink->pprev = 0x%x\n",
+ RTMEMDIAG2 ("memHeapAddBlock: pMemLink->pprev = 0x%x\n",
pMemLink->pprev);
return pMemLink;
RTMEMDIAG2 ("memHeapCheckPtr: for mem_p = 0x%x\n", mem_p);
- if (ppvMemHeap == 0 || *ppvMemHeap == 0 || mem_p == 0)
+ if (ppvMemHeap == 0 || *ppvMemHeap == 0 || mem_p == 0)
return 0;
pMemHeap = *(OSMemHeap**)ppvMemHeap;
for (; pMemLink != 0; pMemLink = pMemLink->pnext) {
if (pMemLink->blockType & RTMEMRAW) {
-
+
/* if RAW block, the pointer should be stored in pMemBlk */
if (pMemLink->pMemBlk == mem_p) {
}
else {
OSMemBlk* pMemBlk = (OSMemBlk*)pMemLink->pMemBlk;
-
+
/* Check, is the pointer inside this memory page */
- if (mem_p > pMemLink->pMemBlk &&
+ if (mem_p > pMemLink->pMemBlk &&
mem_p < (void*)(((ASN1OCTET*)pMemLink->pMemBlk) + pMemBlk->nunits * 8u))
{
/* Check, is the pointer a correct element of the mem page */
OSMemElemDescr* pElem = (OSMemElemDescr*) pMemBlk->data;
for (; pElem != 0; pElem = GETNEXT (pElem)) {
-
+
void* curMem_p = (void*) pElem_data (pElem);
if (curMem_p == mem_p && !ISFREE (pElem)) {
ast_mutex_unlock(&pMemHeap->pLock);
{
OSMemHeap* pMemHeap;
- if (ppvMemHeap == 0)
+ if (ppvMemHeap == 0)
return;
if (*ppvMemHeap == 0)
break;
}
ast_mutex_unlock(&pMemHeap->pLock);
-}
+}
-int memHeapCreate (void** ppvMemHeap)
+int memHeapCreate (void** ppvMemHeap)
{
OSMemHeap* pMemHeap;
if (ppvMemHeap == 0) return ASN_E_INVPARAM;
*ppvMemHeap = (void*)pMemHeap;
return ASN_OK;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
{
OOTRACEERR1("ERROR:Memory - ooCreateCall - call\n");
return NULL;
- }
+ }
memset(call, 0, sizeof(OOH323CallData));
ast_cond_init(&call->gkWait, NULL);
ast_mutex_init(&call->GkLock);
else {
call->ourCallerId[0] = '\0';
}
-
+
memset(&call->callIdentifier, 0, sizeof(H225CallIdentifier));
memset(&call->confIdentifier, 0, sizeof(H225ConferenceIdentifier));
// May 20090713. Fix it for Video session
OO_SETFLAG(call->flags, OO_M_AUDIOSESSION);
-
+
call->callState = OO_CALL_CREATED;
call->callEndReason = OO_REASON_UNKNOWN;
call->pCallFwdData = NULL;
{
call->callingPartyNumber = NULL;
}
- else{
+ else{
if(ooUtilsIsStrEmpty(gH323ep.callingPartyNumber))
{
call->callingPartyNumber = NULL;
}
else{
- call->callingPartyNumber = (char*) memAlloc(call->pctxt,
+ call->callingPartyNumber = (char*) memAlloc(call->pctxt,
strlen(gH323ep.callingPartyNumber)+1);
if(call->callingPartyNumber)
{
call->masterSlaveState = OO_MasterSlave_Idle;
call->statusDeterminationNumber = 0;
call->localTermCapState = OO_LocalTermCapExchange_Idle;
- call->remoteTermCapState = OO_RemoteTermCapExchange_Idle;
+ call->remoteTermCapState = OO_RemoteTermCapExchange_Idle;
call->ourCaps = NULL;
call->remoteCaps = NULL;
call->jointCaps = NULL;
dListInit(&call->remoteFastStartOLCs);
call->remoteTermCapSeqNo =0;
call->localTermCapSeqNo = 0;
- memcpy(&call->capPrefs, &gH323ep.capPrefs, sizeof(OOCapPrefs));
+ memcpy(&call->capPrefs, &gH323ep.capPrefs, sizeof(OOCapPrefs));
call->logicalChans = NULL;
call->noOfLogicalChannels = 0;
call->logicalChanNoBase = 1001;
call->msdRetries = 0;
call->pFastStartRes = NULL;
call->usrData = NULL;
- OOTRACEINFO3("Created a new call (%s, %s)\n", call->callType,
+ OOTRACEINFO3("Created a new call (%s, %s)\n", call->callType,
call->callToken);
/* Add new call to calllist */
ooAddCallToList (call);
int ooEndCall(OOH323CallData *call)
{
- OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n",
- ooGetCallStateText(call->callState), call->callType,
+ OOTRACEDBGA4("In ooEndCall call state is - %s (%s, %s)\n",
+ ooGetCallStateText(call->callState), call->callType,
call->callToken);
if(call->callState == OO_CALL_REMOVED) {
if(call->callState == OO_CALL_CLEARED || ((strcmp(call->callType, "incoming")) &&
call->callState == OO_CALL_CLEAR_RELEASESENT))
{
- ooCleanCall(call);
+ ooCleanCall(call);
call->callState = OO_CALL_REMOVED;
return OO_OK;
}
}
- if(!OO_TESTFLAG(call->flags, OO_M_RELEASE_BUILT))
+ if(!OO_TESTFLAG(call->flags, OO_M_RELEASE_BUILT))
{
- if(call->callState == OO_CALL_CLEAR ||
+ if(call->callState == OO_CALL_CLEAR ||
call->callState == OO_CALL_CLEAR_RELEASERECVD)
{
ooSendReleaseComplete(call);
OO_SETFLAG(call->flags, OO_M_RELEASE_BUILT);
}
}
-
+
return OO_OK;
}
{
OOCTXT *pctxt;
- OOTRACEWARN4 ("Cleaning Call (%s, %s)- reason:%s\n",
- call->callType, call->callToken,
+ OOTRACEWARN4 ("Cleaning Call (%s, %s)- reason:%s\n",
+ call->callType, call->callToken,
ooGetReasonCodeText (call->callEndReason));
/* First clean all the logical channels, if not already cleaned. */
{
ooCloseH245Listener(call);
}
-
+
/* Close H225 connection, if not already closed. */
if (0 != call->pH225Channel && 0 != call->pH225Channel->sock)
{
}
ooRemoveCallFromList (call);
- OOTRACEINFO3("Removed call (%s, %s) from list\n", call->callType,
+ OOTRACEINFO3("Removed call (%s, %s) from list\n", call->callType,
call->callToken);
if(call->pCallFwdData && call->pCallFwdData->fwdedByRemote)
int ooCallSetCallingPartyNumber(OOH323CallData *call, const char *number)
{
- if(call->callingPartyNumber)
+ if(call->callingPartyNumber)
memFreePtr(call->pctxt, call->callingPartyNumber);
call->callingPartyNumber = (char*) memAlloc(call->pctxt, strlen(number)+1);
}
else{
OOTRACEERR3("Error:Memory - ooCallSetCallingPartyNumber - "
- "callingPartyNumber.(%s, %s)\n", call->callType,
+ "callingPartyNumber.(%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
return OO_OK;
}
}
-
+
return OO_FAILED;
}
int ooCallSetCalledPartyNumber(OOH323CallData *call, const char *number)
{
- if(call->calledPartyNumber)
+ if(call->calledPartyNumber)
memFreePtr(call->pctxt, call->calledPartyNumber);
call->calledPartyNumber = (char*) memAlloc(call->pctxt, strlen(number)+1);
}
else{
OOTRACEERR3("Error:Memory - ooCallSetCalledPartyNumber - "
- "calledPartyNumber.(%s, %s)\n", call->callType,
+ "calledPartyNumber.(%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
return OO_OK;
}
}
-
+
return OO_FAILED;
}
call->remoteAliases = psNewAlias;
}
- OOTRACEDBGC5("Added %s alias %s to call. (%s, %s)\n",
+ OOTRACEDBGC5("Added %s alias %s to call. (%s, %s)\n",
local?"local":"remote", value, call->callType, call->callToken);
return OO_OK;
}
int ooCallAddAliasURLID(OOH323CallData *call, const char* url)
{
return ooCallAddAlias(call, T_H225AliasAddress_url_ID, url, TRUE);
-}
-
+}
+
int ooCallAddRemoteAliasH323ID(OOH323CallData *call, const char* h323id)
{
-/* Used to override global end point capabilities and add call specific
+/* Used to override global end point capabilities and add call specific
capabilities */
-int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooCallAddAMRNBCapability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddAMRNBCapability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooCallAddSpeexCapability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddSpeexCapability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooCallAddG729Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG729Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
/*
-int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG726Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
*/
-int ooCallAddG728Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG728Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
-int ooCallAddG711Capability(OOH323CallData *call, int cap, int txframes,
+int ooCallAddG711Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(call, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
int ooCallAddGSMCapability
- (OOH323CallData* call, int cap, ASN1USINT framesPerPkt,
+ (OOH323CallData* call, int cap, ASN1USINT framesPerPkt,
OOBOOL comfortNoise, OOBOOL scrambled, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddGSMCapability(call, cap, framesPerPkt, comfortNoise,
- scrambled, dir, startReceiveChannel,
+ return ooCapabilityAddGSMCapability(call, cap, framesPerPkt, comfortNoise,
+ scrambled, dir, startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
int ooCallAddH263VideoCapability
- (OOH323CallData *call, int cap, unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI, unsigned cif16MPI, unsigned maxBitRate,
+ (OOH323CallData *call, int cap, unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI, unsigned cif16MPI, unsigned maxBitRate,
int dir, cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
return ooCapabilityAddH263VideoCapability(call, sqcifMPI, qcifMPI, cifMPI,
cif4MPI, cif16MPI, maxBitRate,dir,
startReceiveChannel, startTransmitChannel,
- stopReceiveChannel, stopTransmitChannel,
+ stopReceiveChannel, stopTransmitChannel,
FALSE);
}
else
call = call->next;
}
-
+
if(!call)
{
OOTRACEERR2("ERROR:Call with token %s not found\n", callToken);
while(temp)
{
if(temp->sessionID == sessionID &&
- temp->state == OO_LOGICALCHAN_ESTABLISHED &&
+ temp->state == OO_LOGICALCHAN_ESTABLISHED &&
!strcmp(temp->dir, dir) )
return TRUE;
temp = temp->next;
memcpy (newMediaInfo, &mediaInfo, sizeof(OOMediaInfo));
- OOTRACEDBGC4("Configured mediainfo for cap %s (%s, %s)\n",
+ OOTRACEDBGC4("Configured mediainfo for cap %s (%s, %s)\n",
ooGetCapTypeText(mediaInfo.cap),
call->callType, call->callToken);
if(!call->mediaInfo) {
sessionID = call->nextSessionID++;
else{
OOTRACEDBGC4("Session id for %s channel of type audio has to be "
- "provided by remote.(%s, %s)\n", dir, call->callType,
+ "provided by remote.(%s, %s)\n", dir, call->callType,
call->callToken);
sessionID = 0; /* Will be assigned by remote */
}
else{
sessionID = 0; /* Will be assigned by remote */
OOTRACEDBGC4("Session id for %s channel of type video has to be "
- "provided by remote.(%s, %s)\n", dir, call->callType,
+ "provided by remote.(%s, %s)\n", dir, call->callType,
call->callToken);
}
}
else{
sessionID = 0; /* Will be assigned by remote */
OOTRACEDBGC4("Session id for %s channel of type data has to be "
- "provided by remote.(%s, %s)\n", dir, call->callType,
+ "provided by remote.(%s, %s)\n", dir, call->callType,
call->callToken);
}
}
ooTimerCallback *cbData = (ooTimerCallback*) data;
OOH323CallData *call = cbData->call;
- OOTRACEINFO3("H245 connection retry timer expired. (%s, %s)\n",
- call->callType, call->callToken);
+ OOTRACEINFO3("H245 connection retry timer expired. (%s, %s)\n",
+ call->callType, call->callToken);
memFreePtr(call->pctxt, cbData);
call->h245ConnectionAttempts++;
const char* ooGetReasonCodeText (OOUINT32 code)
{
static const char* reasonCodeText[] = {
- "OO_REASON_UNKNOWN",
+ "OO_REASON_UNKNOWN",
"OO_REASON_INVALIDMESSAGE",
- "OO_REASON_TRANSPORTFAILURE",
+ "OO_REASON_TRANSPORTFAILURE",
"OO_REASON_NOROUTE",
"OO_REASON_NOUSER",
"OO_REASON_NOBW",
"OO_REASON_GK_UNREACHABLE",
"OO_REASON_GK_CLEARED",
"OO_REASON_NOCOMMON_CAPABILITIES",
- "OO_REASON_REMOTE_FWDED",
+ "OO_REASON_REMOTE_FWDED",
"OO_REASON_LOCAL_FWDED",
- "OO_REASON_REMOTE_CLEARED",
- "OO_REASON_LOCAL_CLEARED",
+ "OO_REASON_REMOTE_CLEARED",
+ "OO_REASON_LOCAL_CLEARED",
"OO_REASON_REMOTE_BUSY",
"OO_REASON_LOCAL_BUSY",
"OO_REASON_REMOTE_NOANSWER",
};
return ooUtilsGetText (callState, callStateText, OONUMBEROF(callStateText));
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooCalls.h
- * This file contains call management functions.
+ * @file ooCalls.h
+ * This file contains call management functions.
*/
#ifndef _OOCALLS_H_
#define _OOCALLS_H_
#endif
-/**
+/**
* @defgroup callmgmt Call Management
* @{
*/
#define OO_M_DATASESSION ASN1UINTCNT(0x00000200)
#define OO_M_T38SUPPORTED ASN1UINTCNT(0x00000400)
-/**
+/**
* Call states.
*/
typedef enum {
OO_CALL_REMOVED /* call removed */
} OOCallState;
-/**
+/**
* H.245 session states.
*/
typedef enum {
OO_H245SESSION_IDLE,
OO_H245SESSION_PAUSED,
OO_H245SESSION_ACTIVE,
- OO_H245SESSION_ENDSENT,
+ OO_H245SESSION_ENDSENT,
OO_H245SESSION_ENDRECVD,
OO_H245SESSION_CLOSED
} OOH245SessionState;
/**
- * Structure to store local and remote media endpoint info for a
+ * Structure to store local and remote media endpoint info for a
* given media type.
*/
typedef struct OOMediaInfo{
int port;
struct OOAliases *aliases;
OOBOOL fwdedByRemote; /*Set when we are being fwded by remote*/
-} OOCallFwdData;
+} OOCallFwdData;
/**
- * Structure to store information on an H.323 channel (H.225 or H.245) for
+ * Structure to store information on an H.323 channel (H.225 or H.245) for
* a particular call.
*/
typedef struct OOH323Channel {
} OOH323Channel;
/**
- * Structure to store information on fast start response (H.225) to
+ * Structure to store information on fast start response (H.225) to
* reply same answer in CALL PROCEEDING, ALERTING & CONNECT.
*/
typedef struct EXTERN FastStartResponse {
/**
- * This structure is used to maintain all information on an active call.
- * A list of these structures is maintained within the global endpoint
+ * This structure is used to maintain all information on an active call.
+ * A list of these structures is maintained within the global endpoint
* structure.
*/
typedef struct OOH323CallData {
int transfercap;
ASN1USINT callReference;
char ourCallerId[256];
- H225CallIdentifier callIdentifier;/* The call identifier for the active
+ H225CallIdentifier callIdentifier;/* The call identifier for the active
call. */
char *callingPartyNumber;
- char *calledPartyNumber;
+ char *calledPartyNumber;
H225ConferenceIdentifier confIdentifier;
ASN1UINT flags;
OOCallState callState;
DList remoteFastStartOLCs;
ASN1UINT8 remoteTermCapSeqNo;
ASN1UINT8 localTermCapSeqNo;
- OOCapPrefs capPrefs;
- OOLogicalChannel* logicalChans;
+ OOCapPrefs capPrefs;
+ OOLogicalChannel* logicalChans;
int noOfLogicalChannels;
int logicalChanNoBase;
int logicalChanNoMax;
#define ooCallData OOH323CallData
/**
- * This callback function is triggered when a new call structure is
+ * This callback function is triggered when a new call structure is
* created inside the stack for an incoming or outgoing call.
*
* @param call H.323 call data structure
typedef int (*cb_OnNewCallCreated)(OOH323CallData* call);
/**
- * This callback function is triggered when a Q.931 alerting message is
- * received for an outgoing call or when a Q.931 alerting message is sent
+ * This callback function is triggered when a Q.931 alerting message is
+ * received for an outgoing call or when a Q.931 alerting message is sent
* for an incoming call.
*
* @param call H.323 call data structure
typedef int (*cb_OnAlerting)(OOH323CallData * call);
/**
- * This callback function is triggered when there is an incoming call.
- * In the case where a gatekeeper is in use, the call must first be
+ * This callback function is triggered when there is an incoming call.
+ * In the case where a gatekeeper is in use, the call must first be
* admitted by the gatekeeper before this callback is triggered.
*
* @param call H.323 call data structure
typedef int (*cb_OnIncomingCall)(OOH323CallData* call );
/**
- * This callback function is triggered after a Q.931 setup message
+ * This callback function is triggered after a Q.931 setup message
* is sent for an outgoing call.
*
* @param call H.323 call data structure
typedef int (*cb_OnOutgoingCall)(OOH323CallData* call );
/**
- * This callback function is triggered when a Q.931 connect message is
- * sent in case of incoming call. In case of outgoing call, this is invoked
- * when a Q.931 connect message is received. It is not invoked until after
- * fast start and H.245 tunneling messages within the connect message are
+ * This callback function is triggered when a Q.931 connect message is
+ * sent in case of incoming call. In case of outgoing call, this is invoked
+ * when a Q.931 connect message is received. It is not invoked until after
+ * fast start and H.245 tunneling messages within the connect message are
* processed.
*
* @param call H.323 call data structure
typedef int (*cb_OnCallCleared)(struct OOH323CallData* call);
/**
- * This callback function is triggered when master-slave determination
- * and capabilities negotiation procedures are successfully completed
+ * This callback function is triggered when master-slave determination
+ * and capabilities negotiation procedures are successfully completed
* for a call.
*
* @param call H.323 call data structure
(struct OOH323CallData *call, char* remoteIP, int remotePort);
/**
- * This structure holds all of the H.323 signaling callback function
+ * This structure holds all of the H.323 signaling callback function
* addresses.
* @see ooH323EpSetH323Callbacks
*/
EXTERN int ooCallClearAliases(OOH323CallData *call);
/**
- * This function is used to add an H323ID alias to be used by local endpoint
+ * This function is used to add an H323ID alias to be used by local endpoint
* for a particular call.
* @param call Handle to the call
* @param h323id H323ID to add for the local endpoint for the call.
EXTERN int ooCallAddAliasH323ID(OOH323CallData *call, const char* h323id);
/**
- * This function is used to add an dialedDigits alias to be used by local
+ * This function is used to add an dialedDigits alias to be used by local
* endpoint for a particular call.
* @param call Handle to the call
* @param dialedDigits DialedDigits to add for the local endpoint for call.
(OOH323CallData *call, const char* dialedDigits);
/**
- * This function is used to add an email-id alias to be used by local
+ * This function is used to add an email-id alias to be used by local
* endpoint for a particular call.
* @param call Handle to the call
* @param email Email-id to add for the local endpoint for call.
/**
- * This function is used to add an email-id alias to be used by local
+ * This function is used to add an email-id alias to be used by local
* endpoint for a particular call.
* @param call Handle to the call
* @param url URL-id to add for the local endpoint for call.
/**
- * This is a helper function used by other call related add aliases functions
- * to add a particular alias. This function is not supposed to be called
+ * This is a helper function used by other call related add aliases functions
+ * to add a particular alias. This function is not supposed to be called
* directly.
* @param call Handle to the call
* @param aliasType Type of alias being added
/**
- * This function is used to add an dialed digits alias for the remote endpoint
+ * This function is used to add an dialed digits alias for the remote endpoint
* involved in a particular call.
* @param call Handle to the call
* @param dialedDigits dialedDigits alias to add for the remote endpoint.
(OOH323CallData *call, const char* dialedDigits);
/**
- * This function is used to add an H323ID alias for the remote endpoint
+ * This function is used to add an H323ID alias for the remote endpoint
* involved in a particular call.
* @param call Handle to the call
* @param h323id H323ID to add for the remote endpoint.
/**
- * This function is used to add G7231 capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add G7231 capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param silenceSuppression Indicates support for silenceSuppression.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes,
+EXTERN int ooCallAddG7231Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel);
/**
- * This function is used to add G728 capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add G728 capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddG728Capability(OOH323CallData *call, int cap, int txframes,
+EXTERN int ooCallAddG728Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel);
/**
- * This function is used to add G729 capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add G729 capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddG729Capability(OOH323CallData *call, int cap, int txframes,
+EXTERN int ooCallAddG729Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopTransmitChannel stopTransmitChannel);
/**
- * This function is used to add G711 capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add G711 capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddG711Capability(OOH323CallData *call, int cap, int txframes,
+EXTERN int ooCallAddG711Capability(OOH323CallData *call, int cap, int txframes,
int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
/**
- * This function is used to add GSM capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add GSM capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Type of GSM capability to be added.
- * @param framesPerPkt Number of GSM frames pre packet.
- * @param comfortNoise Comfort noise spec for the capability.
+ * @param framesPerPkt Number of GSM frames pre packet.
+ * @param comfortNoise Comfort noise spec for the capability.
* @param scrambled Scrambled enabled/disabled for the capability.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddGSMCapability(OOH323CallData* call, int cap,
- ASN1USINT framesPerPkt, OOBOOL comfortNoise,
+EXTERN int ooCallAddGSMCapability(OOH323CallData* call, int cap,
+ ASN1USINT framesPerPkt, OOBOOL comfortNoise,
OOBOOL scrambled, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
/**
- * This function is used to add H263 video capability for the call. The
- * "ooCallAdd...Capability" functions allow to override the global endpoint
+ * This function is used to add H263 video capability for the call. The
+ * "ooCallAdd...Capability" functions allow to override the global endpoint
* capabilities and use specific capabilities for specific calls.
* @param call Call for which capability has to be added.
* @param cap Capability type - OO_H263VIDEO
- * @param sqcifMPI Minimum picture interval for encoding/decoding
+ * @param sqcifMPI Minimum picture interval for encoding/decoding
* of SQCIF pictures.
- * @param qcifMPI Minimum picture interval for encoding/decoding
+ * @param qcifMPI Minimum picture interval for encoding/decoding
* of QCIF pictures.
- * @param cifMPI Minimum picture interval for encoding/decoding
+ * @param cifMPI Minimum picture interval for encoding/decoding
* of CIF pictures.
- * @param cif4MPI Minimum picture interval for encoding/decoding
+ * @param cif4MPI Minimum picture interval for encoding/decoding
* of CIF4 pictures.
- * @param cif16MPI Minimum picture interval for encoding/decoding
+ * @param cif16MPI Minimum picture interval for encoding/decoding
* of CIF16 pictures.
* @param maxBitRate Maximum bit rate in units of 100 bits/s at
- * which a transmitter can transmit video or a
+ * which a transmitter can transmit video or a
* receiver can receive video.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCallAddH263VideoCapability(OOH323CallData *call, int cap,
- unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI,
- unsigned cif16MPI, unsigned maxBitRate,
- int dir,
+EXTERN int ooCallAddH263VideoCapability(OOH323CallData *call, int cap,
+ unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI,
+ unsigned cif16MPI, unsigned maxBitRate,
+ int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/**
- * This function is used to disable rfc 2833 capability for the call.
- * By default the stack uses the dtmf settings for the endpoint. But if you
- * want to enable/disable dtmf for a specific call, then you can override
+ * This function is used to disable rfc 2833 capability for the call.
+ * By default the stack uses the dtmf settings for the endpoint. But if you
+ * want to enable/disable dtmf for a specific call, then you can override
* end-point settings using this function
* @param call Call for which rfc2833 has to be disabled.
*
/**
- * This function is used to enable H.245(alphanumeric) dtmf support for the
- * call. By default the stack uses the dtmf settings for the endpoint. But if
- * you want to enable H.245(alphanumeric) dtmf for a specific call, then you
+ * This function is used to enable H.245(alphanumeric) dtmf support for the
+ * call. By default the stack uses the dtmf settings for the endpoint. But if
+ * you want to enable H.245(alphanumeric) dtmf for a specific call, then you
* can override end-point settings using this function
* @param call Call for which H.245(alphanumeric) dtmf support
* has to be enabled.
EXTERN int ooCallEnableDTMFH245Alphanumeric(OOH323CallData *call);
/**
- * This function is used to disable H.245(alphanumeric) dtmf support for the
- * call. By default the stack uses the dtmf settings for the endpoint. But if
- * you want to disable H.245(alphanumeric) dtmf for a specific call, then you
+ * This function is used to disable H.245(alphanumeric) dtmf support for the
+ * call. By default the stack uses the dtmf settings for the endpoint. But if
+ * you want to disable H.245(alphanumeric) dtmf for a specific call, then you
* can override end-point settings using this function
* @param call Call for which H.245(alphanumeric) dtmf support
* has to be disabled.
EXTERN int ooCallDisableDTMFH245Alphanumeric(OOH323CallData *call);
/**
- * This function is used to enable H.245(signal) dtmf support for the call.
- * By default the stack uses the dtmf settings for the endpoint. But if you
+ * This function is used to enable H.245(signal) dtmf support for the call.
+ * By default the stack uses the dtmf settings for the endpoint. But if you
* want to enable H.245(signal) dtmf for a specific call, then you can override
* end-point settings using this function
* @param call Call for which H.245(signal) dtmf support
/**
- * This function is used to disable H.245(signal) dtmf support for the call.
- * By default the stack uses the dtmf settings for the endpoint. But if you
- * want to disable H.245(signal) dtmf for a specific call, then you can
+ * This function is used to disable H.245(signal) dtmf support for the call.
+ * By default the stack uses the dtmf settings for the endpoint. But if you
+ * want to disable H.245(signal) dtmf for a specific call, then you can
* override end-point settings using this function
* @param call Call for which H.245(signal) dtmf support
* has to be disabled.
/**
* This function is used to enable Q.931(keypad) dtmf support for the call.
- * By default the stack uses the dtmf settings for the endpoint. But if you
+ * By default the stack uses the dtmf settings for the endpoint. But if you
* want to enable Q.931(keypad) dtmf support for a specific call, then you can
* override end-point settings using this function
* @param call Call for which Q.931(keypad) dtmf support
/**
* This function is used to disable Q.931(keypad) dtmf support for the call.
- * By default the stack uses the dtmf settings for the endpoint. But if you
+ * By default the stack uses the dtmf settings for the endpoint. But if you
* want to disable Q.931(keypad) dtmf support for a specific call, then you can
* override end-point settings using this function
* @param call Call for which Q.931(keypad) dtmf support
/**
* This function is used to remove a call from the list of existing calls.
- *
+ *
* @param call Pointer to the call to be removed.
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooRemoveCallFromList (OOH323CallData *call);
/**
- * This function is used to clean up a call. It closes all associated sockets,
+ * This function is used to clean up a call. It closes all associated sockets,
* removes the call from the global list and frees up associated memory.
*
* @param call Pointer to the call to be cleared.
EXTERN int ooCleanCall(OOH323CallData *call);
/**
- * This function is used to check whether a specified session in specified
+ * This function is used to check whether a specified session in specified
* direction is active for the call.
* @param call Handle to call for which session has to be queried.
- * @param sessionID Session id to identify the type of session(1 for audio,
+ * @param sessionID Session id to identify the type of session(1 for audio,
* 2 for voice and 3 for data)
* @param dir Direction of the session(transmit/receive)
*
- * @return 1, if session active. 0, otherwise.
+ * @return 1, if session active. 0, otherwise.
*/
EXTERN ASN1BOOL ooIsSessionEstablished
(OOH323CallData *call, int sessionID, char* dir);
/**
- * This function can be used by an application to specify media endpoint
+ * This function can be used by an application to specify media endpoint
* information for different types of media. The stack by default uses local IP
- * and port for media. An application can provide mediainfo if it wants to
+ * and port for media. An application can provide mediainfo if it wants to
* override default.
* @param call Handle to the call
- * @param mediaInfo Structure which defines the media endpoint to be
+ * @param mediaInfo Structure which defines the media endpoint to be
* used.
*
* @return OO_OK, on success. OO_FAILED, on failure.
EXTERN int ooAddMediaInfo(OOH323CallData *call, OOMediaInfo mediaInfo);
/**
- * This function is used to generate a media session id for the new media
+ * This function is used to generate a media session id for the new media
* session for the call.
* @param call Handle to the call.
* @param type Type of media session.
(OOH323CallData *call, OOCapType type, char *dir);
/**
- * This is an handler for H245 connection retry timer. When remote end is not
+ * This is an handler for H245 connection retry timer. When remote end is not
* yet listening for H245 connections, this timer provides a wait and retry
* mechanism to establish H245 connection.
* @param data Timer callback data.
*/
EXTERN const char* ooGetCallStateText (OOCallState callState);
-/**
- * @}
+/**
+ * @}
*/
int isRunning(char *callToken);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
}
else{
call->dtmfmode |= OO_CAP_DTMF_RFC2833;
- OOTRACEINFO3("Enabled RFC2833 DTMF capability for (%s, %s) \n",
+ OOTRACEINFO3("Enabled RFC2833 DTMF capability for (%s, %s) \n",
call->callType, call->callToken);
if(dynamicRTPPayloadType >= 96 && dynamicRTPPayloadType <= 127)
call->dtmfcodec = dynamicRTPPayloadType;
}
else{
call->dtmfmode |= OO_CAP_DTMF_CISCO;
- OOTRACEINFO3("Enabled RTP/CISCO DTMF capability for (%s, %s) \n",
+ OOTRACEINFO3("Enabled RTP/CISCO DTMF capability for (%s, %s) \n",
call->callType, call->callToken);
if(dynamicRTPPayloadType >= 96 && dynamicRTPPayloadType <= 127)
call->dtmfcodec = dynamicRTPPayloadType;
}
else{
call->dtmfmode ^= OO_CAP_DTMF_RFC2833;
- OOTRACEINFO3("Disabled RFC2833 DTMF capability for (%s, %s)\n",
+ OOTRACEINFO3("Disabled RFC2833 DTMF capability for (%s, %s)\n",
call->callType, call->callToken);
}
}
else{
call->dtmfmode ^= OO_CAP_DTMF_CISCO;
- OOTRACEINFO3("Disabled RTP/CISCO DTMF capability for (%s, %s)\n",
+ OOTRACEINFO3("Disabled RTP/CISCO DTMF capability for (%s, %s)\n",
call->callType, call->callToken);
}
}
else {
call->dtmfmode |= OO_CAP_DTMF_H245_alphanumeric;
- OOTRACEINFO3("Dtmf mode set to H.245(alphanumeric) for (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode set to H.245(alphanumeric) for (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
else {
call->dtmfmode ^= OO_CAP_DTMF_H245_alphanumeric;
- OOTRACEINFO3("Dtmf mode H.245(alphanumeric) disabled for (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode H.245(alphanumeric) disabled for (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
else {
call->dtmfmode |= OO_CAP_DTMF_H245_signal;
- OOTRACEINFO3("Dtmf mode set to H.245(signal) for (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode set to H.245(signal) for (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
else {
call->dtmfmode ^= OO_CAP_DTMF_H245_signal;
- OOTRACEINFO3("Dtmf mode H.245(signal) disabled for (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode H.245(signal) disabled for (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
else {
call->dtmfmode |= OO_CAP_DTMF_Q931;
- OOTRACEINFO3("Dtmf mode set to Q.931(keypad) for the call (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode set to Q.931(keypad) for the call (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
else {
call->dtmfmode ^= OO_CAP_DTMF_Q931;
- OOTRACEINFO3("Dtmf mode Q.931(keypad) disabled for the call (%s, %s)\n",
+ OOTRACEINFO3("Dtmf mode Q.931(keypad) disabled for the call (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
-int ooCapabilityAddH263VideoCapability(ooCallData *call,
- unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI,
- unsigned cif16MPI, unsigned maxBitRate, int dir,
+int ooCapabilityAddH263VideoCapability(ooCallData *call,
+ unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI,
+ unsigned cif16MPI, unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote)
{
int ret = OO_OK;
if(sqcifMPI>0)
{
- ret = ooCapabilityAddH263VideoCapability_helper(call, sqcifMPI, 0,
+ ret = ooCapabilityAddH263VideoCapability_helper(call, sqcifMPI, 0,
0, 0, 0, maxBitRate, dir, startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, remote);
}
if(cifMPI>0)
{
- ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, cifMPI,
+ ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, cifMPI,
0, 0, maxBitRate, dir, startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, remote);
}
if(cif4MPI>0)
{
- ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, 0,
- cif4MPI, 0, maxBitRate, dir,
+ ret = ooCapabilityAddH263VideoCapability_helper(call, 0, 0, 0,
+ cif4MPI, 0, maxBitRate, dir,
startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, remote);
}
if(cif16MPI>0)
{
- ret = ooCapabilityAddH263VideoCapability_helper(call, dir, 0, 0, 0, 0,
+ ret = ooCapabilityAddH263VideoCapability_helper(call, dir, 0, 0, 0, 0,
cif16MPI, maxBitRate, startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, remote);
}
int ooCapabilityAddH263VideoCapability_helper(ooCallData *call,
- unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI,
- unsigned cif16MPI, unsigned maxBitRate, int dir,
+ unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI,
+ unsigned cif16MPI, unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote)
{
ooH323EpCapability *epCap = NULL, *cur=NULL;
- OOH263CapParams *params=NULL;
+ OOH263CapParams *params=NULL;
OOCTXT *pctxt=NULL;
char *pictureType = NULL;
int cap = OO_H263VIDEO;
".\n");
return OO_FAILED;
}
-
+
if(sqcifMPI>0)
{
params->MPI = sqcifMPI;
}
else
epCap->dir = dir;
-
+
epCap->cap = OO_H263VIDEO;
epCap->capType = OO_CAP_TYPE_VIDEO;
epCap->params = (void*)params;
epCap->startTransmitChannel = startTransmitChannel;
epCap->stopReceiveChannel = stopReceiveChannel;
epCap->stopTransmitChannel = stopTransmitChannel;
-
+
epCap->next = NULL;
if(!call)
else{
/*Add as our capability */
OOTRACEDBGC4("Adding call specific H263 video capability %s. "
- "(%s, %s)\n", pictureType, call->callType,
+ "(%s, %s)\n", pictureType, call->callType,
call->callToken);
if(!call->ourCaps){
call->ourCaps = epCap;
/* Used for g711 ulaw/alaw, g728, g729 and g7231 */
int ooCapabilityAddSimpleCapability
- (OOH323CallData *call, int cap, int txframes,
- int rxframes, OOBOOL silenceSuppression, int dir,
+ (OOH323CallData *call, int cap, int txframes,
+ int rxframes, OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
OOBOOL remote)
{
ooH323EpCapability *epCap = NULL, *cur=NULL;
- OOCapParams *params=NULL;
+ OOCapParams *params=NULL;
OOCTXT *pctxt=NULL;
if(!call) pctxt = &gH323ep.ctxt;
else pctxt = call->pctxt;
else {
epCap->dir = dir;
}
-
+
epCap->cap = cap;
epCap->capType = OO_CAP_TYPE_AUDIO;
epCap->params = (void*)params;
if(!call)
{
/* Add as local capability */
- OOTRACEDBGC2("Adding endpoint capability %s. \n",
+ OOTRACEDBGC2("Adding endpoint capability %s. \n",
ooGetCapTypeText(epCap->cap));
if(!gH323ep.myCaps) {
gH323ep.myCaps = epCap;
}
else{
/* Add as our capability */
- OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
if(!call->ourCaps){
call->ourCaps = epCap;
ooAppendCapToCapPrefs(call, cap);
}
}
-
+
return OO_OK;
}
return 0;
}
-int ooCapabilityAddGSMCapability(OOH323CallData *call, int cap,
+int ooCapabilityAddGSMCapability(OOH323CallData *call, int cap,
unsigned framesPerPkt, OOBOOL comfortNoise,
- OOBOOL scrambled, int dir,
+ OOBOOL scrambled, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote)
{
ooH323EpCapability *epCap = NULL, *cur=NULL;
- OOGSMCapParams *params=NULL;
+ OOGSMCapParams *params=NULL;
OOCTXT *pctxt = NULL;
-
+
if(!call) pctxt = &gH323ep.ctxt;
else pctxt = call->pctxt;
epCap->startTransmitChannel = startTransmitChannel;
epCap->stopReceiveChannel = stopReceiveChannel;
epCap->stopTransmitChannel = stopTransmitChannel;
-
+
epCap->next = NULL;
/* Add as local capability */
if(!call)
}
}
else{
- OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
/*Add as our capability */
if(!call->ourCaps){
OOBOOL remote)
{
ooH323EpCapability *epCap = NULL, *cur=NULL;
- OOCapParams *params=NULL;
+ OOCapParams *params=NULL;
OOCTXT *pctxt=NULL;
if(!call) pctxt = &gH323ep.ctxt;
else pctxt = call->pctxt;
else {
epCap->dir = dir;
}
-
+
epCap->cap = cap;
epCap->capType = OO_CAP_TYPE_DATA;
epCap->params = (void*)params;
if(!call)
{
/* Add as local capability */
- OOTRACEDBGC2("Adding endpoint capability %s. \n",
+ OOTRACEDBGC2("Adding endpoint capability %s. \n",
ooGetCapTypeText(epCap->cap));
if(!gH323ep.myCaps) {
gH323ep.myCaps = epCap;
}
else{
/* Add as our capability */
- OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ OOTRACEDBGC4("Adding call specific capability %s. (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
if(!call->ourCaps){
call->ourCaps = epCap;
call->t38sides |= 1;
}
}
-
+
return OO_OK;
}
"ooCapabilityCreateVideoCapability.\n");
return NULL;
}
-
+
if(!(epCap->dir & dir))
{
OOTRACEERR1("Error:Failed to create capability due to direction "
}
-
+
struct H245AudioCapability* ooCapabilityCreateAudioCapability
(ooH323EpCapability *epCap, OOCTXT *pctxt, int dir)
{
"ooCapabilityCreateAudioCapability.\n");
return NULL;
}
-
+
if(!(epCap->dir & dir))
{
OOTRACEERR1("Error:Failed to create capability due to direction "
switch(cap)
{
case OO_CAP_DTMF_RFC2833:
- pATECap = (H245AudioTelephonyEventCapability*)memAlloc(pctxt,
+ pATECap = (H245AudioTelephonyEventCapability*)memAlloc(pctxt,
sizeof(H245AudioTelephonyEventCapability));
if(!pATECap)
{
pATECap->audioTelephoneEvent = events;
return pATECap;
case OO_CAP_DTMF_CISCO:
- pCSDTMFCap = (H245DataApplicationCapability*)memAlloc(pctxt,
+ pCSDTMFCap = (H245DataApplicationCapability*)memAlloc(pctxt,
sizeof(H245DataApplicationCapability));
if(!pCSDTMFCap)
{
pCSDTMFCap->application.u.nonStandard->nonStandardIdentifier.u.h221NonStandard->t35CountryCode = 181;
pCSDTMFCap->application.u.nonStandard->nonStandardIdentifier.u.h221NonStandard->t35Extension = 0;
pCSDTMFCap->application.u.nonStandard->nonStandardIdentifier.u.h221NonStandard->manufacturerCode = 18;
-
+
return pCSDTMFCap;
case OO_CAP_DTMF_H245_alphanumeric:
- userInput = (H245UserInputCapability*)memAllocZ(pctxt,
+ userInput = (H245UserInputCapability*)memAllocZ(pctxt,
sizeof(H245UserInputCapability));
if(!userInput)
{
userInput->t = T_H245UserInputCapability_basicString;
return userInput;
case OO_CAP_DTMF_H245_signal:
- userInput = (H245UserInputCapability*)memAllocZ(pctxt,
+ userInput = (H245UserInputCapability*)memAllocZ(pctxt,
sizeof(H245UserInputCapability));
if(!userInput)
{
}
params =(OOH263CapParams*)epCap->params;
- pVideo = (H245VideoCapability*)memAllocZ(pctxt,
+ pVideo = (H245VideoCapability*)memAllocZ(pctxt,
sizeof(H245VideoCapability));
- pH263Cap = (H245H263VideoCapability*) memAllocZ(pctxt,
+ pH263Cap = (H245H263VideoCapability*) memAllocZ(pctxt,
sizeof(H245H263VideoCapability));
if(!pVideo || !pH263Cap)
{
return NULL;
}
- pAudio = (H245AudioCapability*)memAlloc(pctxt,
+ pAudio = (H245AudioCapability*)memAlloc(pctxt,
sizeof(H245AudioCapability));
- pGSMCap = (H245GSMAudioCapability*)memAlloc(pctxt,
+ pGSMCap = (H245GSMAudioCapability*)memAlloc(pctxt,
sizeof(H245GSMAudioCapability));
if(!pAudio || !pGSMCap)
{
pGSMCap->audioUnitSize = ((OOGSMCapParams*)epCap->params)->rxframes*OO_GSMFRAMESIZE;
else
pGSMCap->audioUnitSize = ((OOGSMCapParams*)epCap->params)->txframes*OO_GSMFRAMESIZE;
-
+
pGSMCap->comfortNoise = ((OOGSMCapParams*)epCap->params)->comfortNoise;
pGSMCap->scrambled = ((OOGSMCapParams*)epCap->params)->scrambled;
return NULL;
}
params =(OOCapParams*)epCap->params;
- pAudio = (H245AudioCapability*)memAlloc(pctxt,
+ pAudio = (H245AudioCapability*)memAlloc(pctxt,
sizeof(H245AudioCapability));
if(!pAudio)
{
return NULL;
}
-
+
switch(epCap->cap)
{
case OO_G711ALAW64K:
if(dir & OORX)
pAudio->u.g711Alaw56k = params->rxframes;
else
- pAudio->u.g711Alaw56k = params->txframes;
+ pAudio->u.g711Alaw56k = params->txframes;
return pAudio;
case OO_G711ULAW64K:
pAudio->t = T_H245AudioCapability_g711Ulaw64k;
return pAudio;
case OO_G7231:
pAudio->t = T_H245AudioCapability_g7231;
- pAudio->u.g7231 = (H245AudioCapability_g7231*)memAlloc(pctxt,
+ pAudio->u.g7231 = (H245AudioCapability_g7231*)memAlloc(pctxt,
sizeof(H245AudioCapability_g7231));
if(!pAudio->u.g7231)
{
return NULL;
}
- pAudio = (H245AudioCapability*)memAlloc(pctxt,
+ pAudio = (H245AudioCapability*)memAlloc(pctxt,
sizeof(H245AudioCapability));
if(!pAudio)
{
return NULL;
}
-
+
switch(epCap->cap)
{
case OO_AMRNB:
case OO_G726AAL2:
case OO_SPEEX:
pAudio->t = T_H245AudioCapability_nonStandard;
- pAudio->u.nonStandard = (H245NonStandardParameter*)memAlloc(pctxt,
+ pAudio->u.nonStandard = (H245NonStandardParameter*)memAlloc(pctxt,
sizeof(H245NonStandardParameter));
if(!pAudio->u.nonStandard)
{
pAudio->u.nonStandard->nonStandardIdentifier.t=T_H245NonStandardIdentifier_h221NonStandard;
pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard =
- (H245NonStandardIdentifier_h221NonStandard *) memAlloc(pctxt,
+ (H245NonStandardIdentifier_h221NonStandard *) memAlloc(pctxt,
sizeof(H245NonStandardIdentifier_h221NonStandard));
if (!pAudio->u.nonStandard->nonStandardIdentifier.u.h221NonStandard) {
OOTRACEERR2("Error:Memory - ooCapabilityCreateSimpleCapability - %d\n", epCap->cap);
{
app->t = T_H245DataApplicationCapability_application_t38fax;
app->u.t38fax =
- (H245DataMode_application_t38fax *) memAlloc(pctxt,
+ (H245DataMode_application_t38fax *) memAlloc(pctxt,
sizeof(H245DataMode_application_t38fax));
if (!app->u.t38fax) {
OOTRACEERR1("Error:Memory - ooCreateT38AppData\n");
return NULL;
}
- pT38 = (H245DataApplicationCapability*)memAlloc(pctxt,
+ pT38 = (H245DataApplicationCapability*)memAlloc(pctxt,
sizeof(H245DataApplicationCapability));
if(!pT38)
{
}
memset(pT38, 0, sizeof(H245DataApplicationCapability));
pT38app = (void *)&pT38->application;
-
+
switch(epCap->cap)
{
case OO_T38:
/* Used for g711 ulaw/alaw, g728, g729, g729a, g7231 */
ASN1BOOL ooCapabilityCheckCompatibility_Simple
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245AudioCapability* audioCap, int dir)
{
int noofframes=0, cap;
case T_H245AudioCapability_g729AnnexA:
cap = OO_G729A;
noofframes = audioCap->u.g729AnnexA;
- break;
+ break;
case T_H245AudioCapability_g729wAnnexB:
cap = OO_G729B;
noofframes = audioCap->u.g729wAnnexB;
- break;
+ break;
case T_H245AudioCapability_g7231:
cap = OO_G7231;
noofframes = audioCap->u.g7231->maxAl_sduAudioFrames;
return FALSE;
}
- OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n",
+ OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n",
epCap->cap, cap);
if(cap != epCap->cap) { return FALSE; }
}
/* Used for g726, AMRNB */
ASN1BOOL ooCapabilityCheckCompatibility_NonStandard
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245AudioCapability* audioCap, int dir)
{
int cap;
if (audioCap->t == T_H245AudioCapability_nonStandard &&
audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard) {
switch (audioCap->u.nonStandard->data.numocts) {
case sizeof("G.726-32k")-1:
return FALSE;
break;
case sizeof("AMRNB")-1: /* case sizeof("Speex")-1 */
- if (!strncmp((char *)audioCap->u.nonStandard->data.data, "AMRNB",
+ if (!strncmp((char *)audioCap->u.nonStandard->data.data, "AMRNB",
audioCap->u.nonStandard->data.numocts))
cap = OO_AMRNB;
- else if (!strncmp((char *)audioCap->u.nonStandard->data.data, "Speex",
+ else if (!strncmp((char *)audioCap->u.nonStandard->data.data, "Speex",
audioCap->u.nonStandard->data.numocts))
cap = OO_SPEEX;
else
} else
return FALSE;
- OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n",
+ OOTRACEDBGC3("Comparing codecs: current=%d, requested=%d\n",
epCap->cap, cap);
if(cap != epCap->cap) { return FALSE; }
OOBOOL ooCapabilityCheckCompatibility_GSM
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245AudioCapability* audioCap, int dir)
{
unsigned noofframes=0, cap;
{
if(((OOGSMCapParams*)epCap->params)->txframes > noofframes){
OOTRACEDBGA5("Reducing txframes for GSM from %d to %d to match "
- "receive capability of remote end.(%s, %s)\n",
- ((OOGSMCapParams*)epCap->params)->txframes, noofframes,
+ "receive capability of remote end.(%s, %s)\n",
+ ((OOGSMCapParams*)epCap->params)->txframes, noofframes,
call->callType, call->callToken);
((OOGSMCapParams*)epCap->params)->txframes = noofframes;
}
}
OOBOOL ooCapabilityCheckCompatibility_T38
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245DataApplicationCapability* t38Cap, int dir)
{
unsigned cap = 0;
OOBOOL ooCapabilityCheckCompatibility_H263Video
- (struct OOH323CallData *call, ooH323EpCapability *epCap,
+ (struct OOH323CallData *call, ooH323EpCapability *epCap,
H245VideoCapability *pVideoCap, int dir)
{
H245H263VideoCapability *pH263Cap = NULL;
OOH263CapParams *params = epCap->params;
- if(!pVideoCap->u.h263VideoCapability)
+ if(!pVideoCap->u.h263VideoCapability)
{
OOTRACEERR3("Error:No H263 video capability present in video capability"
"structure. (%s, %s)\n", call->callType, call->callToken);
return FALSE;
}
pH263Cap = pVideoCap->u.h263VideoCapability;
-
+
/* can we receive/transmit this capability */
if(OORX & dir)
{
}
}
}
-
+
return FALSE;
}
OOBOOL ooCapabilityCheckCompatibility_Audio
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245AudioCapability* audioCap, int dir)
{
return FALSE;
}
- return FALSE;
+ return FALSE;
}
OOBOOL ooCapabilityCheckCompatibility_Video
- (OOH323CallData *call, ooH323EpCapability* epCap,
+ (OOH323CallData *call, ooH323EpCapability* epCap,
H245VideoCapability* videoCap, int dir)
{
switch(videoCap->t)
{
case T_H245VideoCapability_h263VideoCapability:
- return ooCapabilityCheckCompatibility_H263Video(call, epCap,
+ return ooCapabilityCheckCompatibility_H263Video(call, epCap,
videoCap, dir);
default:
OOTRACEDBGC3("ooCapabilityCheckCompatibility_Video - Unsupported video "
can receive only y, then we can't reduce our transmit rate
*/
OOBOOL ooCapabilityCheckCompatibility
- (struct OOH323CallData *call, ooH323EpCapability* epCap,
+ (struct OOH323CallData *call, ooH323EpCapability* epCap,
H245DataType* dataType, int dir)
{
switch(dataType->t)
{
case T_H245DataType_audioData:
if(epCap->capType == OO_CAP_TYPE_AUDIO)
- return ooCapabilityCheckCompatibility_Audio(call, epCap,
+ return ooCapabilityCheckCompatibility_Audio(call, epCap,
dataType->u.audioData, dir);
break;
case T_H245DataType_videoData:
if(epCap->capType == OO_CAP_TYPE_VIDEO)
- return ooCapabilityCheckCompatibility_Video(call, epCap,
+ return ooCapabilityCheckCompatibility_Video(call, epCap,
dataType->u.videoData, dir);
break;
case T_H245DataType_data:
if(txCap->cap != rxCap->cap) return FALSE;
if(!(txCap->dir & OOTX)) return FALSE;
-
+
if(!(rxCap->dir & OORX)) return FALSE;
switch(txCap->cap)
- {
+ {
case OO_G711ALAW64K:
case OO_G711ALAW56K:
case OO_G711ULAW64K:
case OO_G729A:
case OO_G729B:
case OO_G7231:
- if(((OOCapParams*)txCap->params)->txframes <=
+ if(((OOCapParams*)txCap->params)->txframes <=
((OOCapParams*)rxCap->params)->rxframes)
return TRUE;
else{
- OOTRACEDBGA4("Simple caps %s are not compatible.(%s, %s)\n",
- ooGetCapTypeText(txCap->cap), call->callType,
+ OOTRACEDBGA4("Simple caps %s are not compatible.(%s, %s)\n",
+ ooGetCapTypeText(txCap->cap), call->callType,
call->callToken);
return FALSE;
}
case OO_GSMFULLRATE:
case OO_GSMHALFRATE:
case OO_GSMENHANCEDFULLRATE:
- if(((OOGSMCapParams*)txCap->params)->txframes <=
+ if(((OOGSMCapParams*)txCap->params)->txframes <=
((OOGSMCapParams*)rxCap->params)->rxframes)
return TRUE;
else{
OOTRACEDBGA3("GSM caps are not compatible. (%s, %s)\n", call->callType,
call->callToken);
return FALSE;
- }
+ }
default:
OOTRACEWARN3("WARN: Unsupported capabilities being compared. (%s, %s)\n",
call->callType, call->callToken);
cap = OO_GSMENHANCEDFULLRATE;
break;
default:
- OOTRACEERR3("Error:Invalid GSM capability type.(%s, %s)\n",
+ OOTRACEERR3("Error:Invalid GSM capability type.(%s, %s)\n",
call->callType, call->callToken);
return NULL;
}
OOTRACEDBGC4("Determined audio data type to be of type %d. Searching"
- " for matching capability.(%s, %s)\n", cap, call->callType,
+ " for matching capability.(%s, %s)\n", cap, call->callType,
call->callToken);
/* If we have call specific caps then we use them, otherwise we use
general endpoint caps*/
- if(call->ourCaps)
+ if(call->ourCaps)
cur = call->ourCaps;
else
cur = gH323ep.myCaps;
{
OOTRACEDBGC4("Local cap being compared %d. (%s, %s)\n", cur->cap,
call->callType, call->callToken);
-
+
if(cur->cap == cap && (cur->dir & dir))
break;
cur = cur->next;
}
-
+
if(!cur) return NULL;
-
+
OOTRACEDBGC4("Found matching audio capability type %d. Comparing"
- " other parameters. (%s, %s)\n", cap, call->callType,
+ " other parameters. (%s, %s)\n", cap, call->callType,
call->callToken);
-
+
/* can we receive this capability */
if(dir & OORX)
{
if(((OOGSMCapParams*)cur->params)->rxframes < framesPerPkt)
return NULL;
else{
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params =(OOGSMCapParams*)memAlloc(call->pctxt,sizeof(OOGSMCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeGSMSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
/* Can we transmit compatible stream */
if(dir & OOTX)
{
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params =(OOGSMCapParams*)memAlloc(call->pctxt,sizeof(OOGSMCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeGSMSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
{
OOTRACEINFO5("Reducing framesPerPkt for transmission of GSM "
"capability from %d to %d to match receive capability of"
- " remote endpoint.(%s, %s)\n", params->txframes,
+ " remote endpoint.(%s, %s)\n", params->txframes,
framesPerPkt, call->callType, call->callToken);
params->txframes = framesPerPkt;
}
}
OOTRACEDBGC4("Determined Simple audio data type to be of type %s. Searching"
- " for matching capability.(%s, %s)\n",
+ " for matching capability.(%s, %s)\n",
ooGetCapTypeText(cap), call->callType, call->callToken);
/* If we have call specific caps, we use them; otherwise use general
endpoint caps
- */
+ */
if(call->ourCaps)
cur = call->ourCaps;
else
while(cur)
{
- OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
+ OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
ooGetCapTypeText(cur->cap),call->callType, call->callToken);
-
+
if(cur->cap == cap && (cur->dir & dir))
break;
cur = cur->next;
}
-
+
if(!cur) return NULL;
-
+
OOTRACEDBGC4("Found matching simple audio capability type %s. Comparing"
- " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
+ " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
call->callType, call->callToken);
-
+
/* can we receive this capability */
if(dir & OORX)
{
if(((OOCapParams*)cur->params)->rxframes < framesPerPkt)
return NULL;
- if(((OOCapParams*)cur->params)->rxframes > framesPerPkt)
+ if(((OOCapParams*)cur->params)->rxframes > framesPerPkt)
((OOCapParams*)cur->params)->rxframes = framesPerPkt;
- OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params=(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOCapParams));
OOTRACEDBGC4("Returning copy of matched receive capability %s. "
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
/* Can we transmit compatible stream */
if(dir & OOTX)
{
- OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params =(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
{
OOTRACEINFO5("Reducing framesPerPkt for transmission of Simple "
"capability from %d to %d to match receive capability of"
- " remote endpoint.(%s, %s)\n", params->txframes,
+ " remote endpoint.(%s, %s)\n", params->txframes,
framesPerPkt, call->callType, call->callToken);
params->txframes = framesPerPkt;
}
OOTRACEDBGC4("Returning copy of matched transmit capability %s."
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
OOCapParams * params= NULL;
if (audioCap->t == T_H245AudioCapability_nonStandard &&
- audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ audioCap->u.nonStandard &&
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard) {
switch (audioCap->u.nonStandard->data.numocts) {
case sizeof("G.726-32k")-1:
return NULL;
OOTRACEDBGC4("Determined Simple audio data type to be of type %s. Searching"
- " for matching capability.(%s, %s)\n",
+ " for matching capability.(%s, %s)\n",
ooGetCapTypeText(cap), call->callType, call->callToken);
/* If we have call specific caps, we use them; otherwise use general
endpoint caps
- */
+ */
if(call->ourCaps)
cur = call->ourCaps;
else
while(cur)
{
- OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
+ OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
ooGetCapTypeText(cur->cap),call->callType, call->callToken);
-
+
if(cur->cap == cap && (cur->dir & dir))
break;
cur = cur->next;
}
-
+
if(!cur) return NULL;
-
+
OOTRACEDBGC4("Found matching simple audio capability type %s. Comparing"
- " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
+ " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
call->callType, call->callToken);
-
+
/* can we receive this capability */
if(dir & OORX)
{
- OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params=(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOCapParams));
OOTRACEDBGC4("Returning copy of matched receive capability %s. "
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
/* Can we transmit compatible stream */
if(dir & OOTX)
{
- OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params =(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOCapParams));
OOTRACEDBGC4("Returning copy of matched transmit capability %s."
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
case T_H245AudioCapability_gsmFullRate:
case T_H245AudioCapability_gsmHalfRate:
case T_H245AudioCapability_gsmEnhancedFullRate:
- return ooIsAudioDataTypeGSMSupported(call, audioCap, dir);
+ return ooIsAudioDataTypeGSMSupported(call, audioCap, dir);
default:
return NULL;
- }
+ }
}
ooH323EpCapability* ooIsT38Supported
break;
default:
return NULL;
- }
+ }
if(call->ourCaps)
cur = call->ourCaps;
while(cur)
{
- OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
+ OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
ooGetCapTypeText(cur->cap),call->callType, call->callToken);
-
+
if(cur->cap == cap && (cur->dir & dir))
break;
cur = cur->next;
}
-
+
if(!cur) return NULL;
-
+
OOTRACEDBGC4("Found matching t38 capability type %s. Comparing"
- " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
+ " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
call->callType, call->callToken);
-
+
/* can we receive this capability */
if(dir & OORX)
{
- OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can receive Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAllocZ(call->pctxt,
+ epCap = (ooH323EpCapability*)memAllocZ(call->pctxt,
sizeof(ooH323EpCapability));
params=(OOCapParams*)memAlloc(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsT38Supported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOCapParams));
OOTRACEDBGC4("Returning copy of matched receive capability %s. "
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
/* Can we transmit compatible stream */
if(dir & OOTX)
{
- OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ OOTRACEDBGC4("We can transmit Simple capability %s. (%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
params =(OOCapParams*)memAllocZ(call->pctxt,sizeof(OOCapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsAudioDataTypeSimpleSupported - "
- "epCap/params (%s, %s)\n", call->callType,
+ "epCap/params (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOCapParams));
OOTRACEDBGC4("Returning copy of matched transmit capability %s."
- "(%s, %s)\n",
- ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n",
+ ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
}
ooH323EpCapability* ooIsVideoDataTypeH263Supported
- (OOH323CallData *call, H245H263VideoCapability* pH263Cap, int dir,
+ (OOH323CallData *call, H245H263VideoCapability* pH263Cap, int dir,
OOPictureFormat picFormat)
{
int cap;
ooH323EpCapability *cur=NULL, *epCap=NULL;
- OOH263CapParams *params= NULL;
+ OOH263CapParams *params= NULL;
char *pictureType=NULL;
unsigned mpi=0;
cap = OO_H263VIDEO;
pictureType = "CIF16";
mpi = pH263Cap->cif16MPI;
}
-
- OOTRACEDBGA4("Looking for H263 video capability(%s). (%s, %s)\n",
+
+ OOTRACEDBGA4("Looking for H263 video capability(%s). (%s, %s)\n",
pictureType, call->callType, call->callToken);
/* If we have call specific caps, we use them; otherwise use general
endpoint caps
- */
+ */
if(call->ourCaps)
cur = call->ourCaps;
else
while(cur)
{
- OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
+ OOTRACEDBGC4("Local cap being compared %s. (%s, %s)\n",
ooGetCapTypeText(cur->cap),call->callType, call->callToken);
-
+
if(cur->cap == cap && (cur->dir & dir))
{
if(((OOH263CapParams*)cur->params)->picFormat == picFormat)
}
cur = cur->next;
}
-
+
if(!cur) return NULL;
-
+
OOTRACEDBGC4("Found matching H.263 video capability type %s. Comparing"
- " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
- call->callType, call->callToken);
+ " other parameters. (%s, %s)\n", ooGetCapTypeText(cap),
+ call->callType, call->callToken);
if(dir & OORX)
{
if(mpi < ((OOH263CapParams*)cur->params)->MPI)
return NULL;
else{
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
- params = (OOH263CapParams*) memAlloc(call->pctxt,
+ params = (OOH263CapParams*) memAlloc(call->pctxt,
sizeof(OOH263CapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - "
- "epCap/params. (%s, %s)\n", call->callType,
+ "epCap/params. (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
epCap->next = NULL;
memcpy(epCap->params, cur->params, sizeof(OOH263CapParams));
OOTRACEDBGC4("Returning copy of matched receive capability %s. "
- "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
}
if(dir & OOTX)
{
- epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
+ epCap = (ooH323EpCapability*)memAlloc(call->pctxt,
sizeof(ooH323EpCapability));
- params = (OOH263CapParams*) memAlloc(call->pctxt,
+ params = (OOH263CapParams*) memAlloc(call->pctxt,
sizeof(OOH263CapParams));
if(!epCap || !params)
{
OOTRACEERR3("Error:Memory - ooIsVideoDataTypeH263Supported - "
- "epCap/params. (%s, %s)\n", call->callType,
+ "epCap/params. (%s, %s)\n", call->callType,
call->callToken);
return NULL;
}
{
OOTRACEINFO5("Increasing minimum picture interval for transmission of"
" H263 video capability from %d to %d to match receive "
- "capability of remote endpoint.(%s, %s)\n", params->MPI,
+ "capability of remote endpoint.(%s, %s)\n", params->MPI,
mpi, call->callType, call->callToken);
params->MPI = mpi;
}
OOTRACEDBGC4("Returning copy of matched receive capability %s. "
- "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType,
+ "(%s, %s)\n", ooGetCapTypeText(cur->cap), call->callType,
call->callToken);
return epCap;
}
ooH323EpCapability* ooIsVideoDataTypeSupported
(OOH323CallData *call, H245VideoCapability* pVideoCap, int dir)
{
- switch(pVideoCap->t)
+ switch(pVideoCap->t)
{
case T_H245VideoCapability_h263VideoCapability:
if(pVideoCap->u.h263VideoCapability->m.sqcifMPIPresent)
- return ooIsVideoDataTypeH263Supported(call,
+ return ooIsVideoDataTypeH263Supported(call,
pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_SQCIF);
else if(pVideoCap->u.h263VideoCapability->m.qcifMPIPresent)
- return ooIsVideoDataTypeH263Supported(call,
+ return ooIsVideoDataTypeH263Supported(call,
pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_QCIF);
else if(pVideoCap->u.h263VideoCapability->m.cifMPIPresent)
- return ooIsVideoDataTypeH263Supported(call,
+ return ooIsVideoDataTypeH263Supported(call,
pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF);
else if(pVideoCap->u.h263VideoCapability->m.cif4MPIPresent)
- return ooIsVideoDataTypeH263Supported(call,
+ return ooIsVideoDataTypeH263Supported(call,
pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF4);
else if(pVideoCap->u.h263VideoCapability->m.cif16MPIPresent)
- return ooIsVideoDataTypeH263Supported(call,
+ return ooIsVideoDataTypeH263Supported(call,
pVideoCap->u.h263VideoCapability, dir, OO_PICFORMAT_CIF16);
- break;
+ break;
case T_H245VideoCapability_nonStandard:
case T_H245VideoCapability_h261VideoCapability:
case T_H245VideoCapability_h262VideoCapability:
ooH323EpCapability* ooIsDataTypeSupported
(OOH323CallData *call, H245DataType *data, int dir)
{
- OOTRACEDBGC3("Looking for data type support. (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Looking for data type support. (%s, %s)\n", call->callType,
call->callToken);
-
+
switch(data->t)
{
case T_H245DataType_nonStandard:
- OOTRACEDBGC3("NonStandard data type not supported.(%s, %s)\n",
+ OOTRACEDBGC3("NonStandard data type not supported.(%s, %s)\n",
call->callType, call->callToken);
return NULL;
case T_H245DataType_nullData:
- OOTRACEDBGC3("Null data type not supported.(%s, %s)\n",
+ OOTRACEDBGC3("Null data type not supported.(%s, %s)\n",
call->callType, call->callToken);
return NULL;
case T_H245DataType_videoData:
return ooIsAudioDataTypeSupported(call, data->u.audioData, dir);
case T_H245DataType_data:
- OOTRACEDBGC3("Looking for application data dataType support.(%s, %s)\n",
+ OOTRACEDBGC3("Looking for application data dataType support.(%s, %s)\n",
call->callType, call->callToken);
return ooIsT38Supported(call, data->u.data, dir);
case T_H245DataType_encryptionData:
- OOTRACEDBGC3("Encryption data type not supported.(%s, %s)\n",
+ OOTRACEDBGC3("Encryption data type not supported.(%s, %s)\n",
call->callType, call->callToken);
return NULL;
case T_H245DataType_h235Control:
case T_H245DataType_multiplexedStream:
return NULL;
default:
- OOTRACEINFO3("Unknown data type (%s, %s)\n", call->callType,
+ OOTRACEINFO3("Unknown data type (%s, %s)\n", call->callType,
call->callToken);
}
return NULL;
memcpy(&oldPrefs, capPrefs, sizeof(OOCapPrefs));
memset(capPrefs, 0, sizeof(OOCapPrefs));
for(i=0; i<oldPrefs.index; i++)
- {
- if(oldPrefs.order[i] != cap)
+ {
+ if(oldPrefs.order[i] != cap)
capPrefs->order[j++] = oldPrefs.order[i];
}
capPrefs->index = j;
return OO_OK;
}
-
+
int ooAppendCapToCapPrefs(OOH323CallData *call, int cap)
{
OOCapPrefs *capPrefs=NULL;
/* Decrease Pref order */
if(i < pos)
{
- for( ; i<pos; i++)
+ for( ; i<pos; i++)
capPrefs->order[i] = capPrefs->order[i+1];
capPrefs->order[i]=cap;
return OO_OK;
memcpy(&oldPrefs, capPrefs, sizeof(OOCapPrefs));
-
+
capPrefs->order[j++] = cap;
for(i=0; i<oldPrefs.index; i++)
- {
- if(oldPrefs.order[i] != cap)
+ {
+ if(oldPrefs.order[i] != cap)
capPrefs->order[j++] = oldPrefs.order[i];
}
capPrefs->index = j;
switch(cap->t)
{
case T_H245Capability_receiveAudioCapability:
- return ooAddRemoteAudioCapability(call, cap->u.receiveAudioCapability,
+ return ooAddRemoteAudioCapability(call, cap->u.receiveAudioCapability,
OORX);
case T_H245Capability_transmitAudioCapability:
- return ooAddRemoteAudioCapability(call, cap->u.transmitAudioCapability,
+ return ooAddRemoteAudioCapability(call, cap->u.transmitAudioCapability,
OOTX);
case T_H245Capability_receiveAndTransmitAudioCapability:
- return ooAddRemoteAudioCapability(call,
+ return ooAddRemoteAudioCapability(call,
cap->u.receiveAndTransmitAudioCapability, OORXTX);
case T_H245Capability_receiveDataApplicationCapability:
- return ooAddRemoteDataApplicationCapability(call, cap->u.receiveDataApplicationCapability,
+ return ooAddRemoteDataApplicationCapability(call, cap->u.receiveDataApplicationCapability,
OORX);
case T_H245Capability_transmitDataApplicationCapability:
- return ooAddRemoteDataApplicationCapability(call, cap->u.transmitDataApplicationCapability,
+ return ooAddRemoteDataApplicationCapability(call, cap->u.transmitDataApplicationCapability,
OOTX);
case T_H245Capability_receiveAndTransmitDataApplicationCapability:
- return ooAddRemoteDataApplicationCapability(call,
+ return ooAddRemoteDataApplicationCapability(call,
cap->u.receiveAndTransmitDataApplicationCapability, OORXTX);
default:
- OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n",
+ OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
}
-int ooAddRemoteDataApplicationCapability(OOH323CallData *call,
+int ooAddRemoteDataApplicationCapability(OOH323CallData *call,
H245DataApplicationCapability *dataCap,
int dir)
{
dir, NULL, NULL, NULL, NULL,TRUE);
default:
OOTRACEDBGA1("Unsupported data capability type\n");
-
+
}
return OO_OK;
}
-int ooAddRemoteAudioCapability(OOH323CallData *call,
+int ooAddRemoteAudioCapability(OOH323CallData *call,
H245AudioCapability *audioCap,
int dir)
{
int rxframes=0, txframes=0;
-
+
switch(audioCap->t)
{
case T_H245AudioCapability_g711Alaw64k:
if(dir&OOTX) txframes = audioCap->u.g711Alaw64k;
else if(dir&OORX) rxframes = audioCap->u.g711Alaw64k;
- else{
- txframes = audioCap->u.g711Alaw64k;
- rxframes = audioCap->u.g711Alaw64k;
+ else{
+ txframes = audioCap->u.g711Alaw64k;
+ rxframes = audioCap->u.g711Alaw64k;
}
- return ooCapabilityAddSimpleCapability(call, OO_G711ALAW64K, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G711ALAW64K, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL,TRUE);
case T_H245AudioCapability_g711Alaw56k:
if(dir&OOTX) txframes = audioCap->u.g711Alaw56k;
else if(dir&OORX) rxframes = audioCap->u.g711Alaw56k;
- else{
- txframes = audioCap->u.g711Alaw56k;
- rxframes = audioCap->u.g711Alaw56k;
+ else{
+ txframes = audioCap->u.g711Alaw56k;
+ rxframes = audioCap->u.g711Alaw56k;
}
- return ooCapabilityAddSimpleCapability(call, OO_G711ALAW56K, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G711ALAW56K, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g711Ulaw64k:
if(dir&OOTX) txframes = audioCap->u.g711Ulaw64k;
else if(dir&OORX) rxframes = audioCap->u.g711Ulaw64k;
- else{
- txframes = audioCap->u.g711Ulaw64k;
- rxframes = audioCap->u.g711Ulaw64k;
+ else{
+ txframes = audioCap->u.g711Ulaw64k;
+ rxframes = audioCap->u.g711Ulaw64k;
}
- return ooCapabilityAddSimpleCapability(call, OO_G711ULAW64K, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G711ULAW64K, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g711Ulaw56k:
if(dir&OOTX) txframes = audioCap->u.g711Ulaw56k;
else if(dir&OORX) rxframes = audioCap->u.g711Ulaw56k;
- else{
- txframes = audioCap->u.g711Ulaw56k;
- rxframes = audioCap->u.g711Ulaw56k;
+ else{
+ txframes = audioCap->u.g711Ulaw56k;
+ rxframes = audioCap->u.g711Ulaw56k;
}
- return ooCapabilityAddSimpleCapability(call, OO_G711ULAW56K, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G711ULAW56K, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
/* case T_H245AudioCapability_g726:
if(dir&OOTX) txframes = audioCap->u.g726;
else if(dir&OORX) rxframes = audioCap->u.g726;
- else{
- txframes = audioCap->u.g726;
- rxframes = audioCap->u.g726;
+ else{
+ txframes = audioCap->u.g726;
+ rxframes = audioCap->u.g726;
}
- return ooCapabilityAddSimpleCapability(call, OO_G726, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G726, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
*/
case T_H245AudioCapability_nonStandard:
- if (audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ if (audioCap->u.nonStandard &&
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard &&
audioCap->u.nonStandard->data.numocts == sizeof("G.726-32k")-1 &&
- !strncmp((char *)audioCap->u.nonStandard->data.data, "G.726-32k",
+ !strncmp((char *)audioCap->u.nonStandard->data.data, "G.726-32k",
audioCap->u.nonStandard->data.numocts))
- return ooCapabilityAddSimpleCapability(call, OO_G726, 20,
+ return ooCapabilityAddSimpleCapability(call, OO_G726, 20,
240, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
- if (audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ if (audioCap->u.nonStandard &&
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard &&
audioCap->u.nonStandard->data.numocts == sizeof("G726r32")-1 &&
- !strncmp((char *)audioCap->u.nonStandard->data.data, "G726r32",
+ !strncmp((char *)audioCap->u.nonStandard->data.data, "G726r32",
audioCap->u.nonStandard->data.numocts))
- return ooCapabilityAddSimpleCapability(call, OO_G726AAL2, 20,
+ return ooCapabilityAddSimpleCapability(call, OO_G726AAL2, 20,
240, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
- if (audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ if (audioCap->u.nonStandard &&
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard &&
audioCap->u.nonStandard->data.numocts == sizeof("AMRNB")-1 &&
- !strncmp((char *)audioCap->u.nonStandard->data.data, "AMRNB",
+ !strncmp((char *)audioCap->u.nonStandard->data.data, "AMRNB",
audioCap->u.nonStandard->data.numocts))
- return ooCapabilityAddSimpleCapability(call, OO_AMRNB, 4,
+ return ooCapabilityAddSimpleCapability(call, OO_AMRNB, 4,
4, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
- if (audioCap->u.nonStandard &&
- audioCap->u.nonStandard->nonStandardIdentifier.t ==
+ if (audioCap->u.nonStandard &&
+ audioCap->u.nonStandard->nonStandardIdentifier.t ==
T_H245NonStandardIdentifier_h221NonStandard &&
audioCap->u.nonStandard->data.numocts == sizeof("Speex")-1 &&
- !strncmp((char *)audioCap->u.nonStandard->data.data, "Speex",
+ !strncmp((char *)audioCap->u.nonStandard->data.data, "Speex",
audioCap->u.nonStandard->data.numocts))
- return ooCapabilityAddSimpleCapability(call, OO_SPEEX, 4,
+ return ooCapabilityAddSimpleCapability(call, OO_SPEEX, 4,
4, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
break;
case T_H245AudioCapability_g728:
if(dir&OOTX) txframes = audioCap->u.g728;
else if(dir&OORX) rxframes = audioCap->u.g728;
- else{
- txframes = audioCap->u.g728;
- rxframes = audioCap->u.g728;
+ else{
+ txframes = audioCap->u.g728;
+ rxframes = audioCap->u.g728;
}
- return ooCapabilityAddSimpleCapability(call, OO_G728, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G728, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g729:
if(dir&OOTX) txframes = audioCap->u.g729;
else if(dir&OORX) rxframes = audioCap->u.g729;
- else{
- txframes = audioCap->u.g729;
- rxframes = audioCap->u.g729;
+ else{
+ txframes = audioCap->u.g729;
+ rxframes = audioCap->u.g729;
}
- return ooCapabilityAddSimpleCapability(call, OO_G729, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G729, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g729AnnexA:
if(dir&OOTX) txframes = audioCap->u.g729AnnexA;
else if(dir&OORX) rxframes = audioCap->u.g729AnnexA;
- else{
- txframes = audioCap->u.g729AnnexA;
- rxframes = audioCap->u.g729AnnexA;
+ else{
+ txframes = audioCap->u.g729AnnexA;
+ rxframes = audioCap->u.g729AnnexA;
}
- return ooCapabilityAddSimpleCapability(call, OO_G729A, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G729A, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g729wAnnexB:
if(dir&OOTX) txframes = audioCap->u.g729wAnnexB;
else if(dir&OORX) rxframes = audioCap->u.g729wAnnexB;
- else{
- txframes = audioCap->u.g729wAnnexB;
- rxframes = audioCap->u.g729wAnnexB;
+ else{
+ txframes = audioCap->u.g729wAnnexB;
+ rxframes = audioCap->u.g729wAnnexB;
}
- return ooCapabilityAddSimpleCapability(call, OO_G729B, txframes,
+ return ooCapabilityAddSimpleCapability(call, OO_G729B, txframes,
rxframes, FALSE, dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_g7231:
if(dir&OOTX) txframes = audioCap->u.g7231->maxAl_sduAudioFrames;
else if(dir&OORX) rxframes = audioCap->u.g7231->maxAl_sduAudioFrames;
- else{
- txframes = audioCap->u.g7231->maxAl_sduAudioFrames;
- rxframes = audioCap->u.g7231->maxAl_sduAudioFrames;
+ else{
+ txframes = audioCap->u.g7231->maxAl_sduAudioFrames;
+ rxframes = audioCap->u.g7231->maxAl_sduAudioFrames;
}
return ooCapabilityAddSimpleCapability(call, OO_G7231, txframes,rxframes,
audioCap->u.g7231->silenceSuppression,
- dir, NULL, NULL, NULL, NULL, TRUE);
+ dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_gsmFullRate:
- return ooCapabilityAddGSMCapability(call, OO_GSMFULLRATE,
+ return ooCapabilityAddGSMCapability(call, OO_GSMFULLRATE,
(unsigned)(audioCap->u.gsmFullRate->audioUnitSize/OO_GSMFRAMESIZE),
audioCap->u.gsmFullRate->comfortNoise,
- audioCap->u.gsmFullRate->scrambled,
+ audioCap->u.gsmFullRate->scrambled,
dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_gsmHalfRate:
return ooCapabilityAddGSMCapability(call, OO_GSMHALFRATE,
(unsigned)(audioCap->u.gsmHalfRate->audioUnitSize/OO_GSMFRAMESIZE),
audioCap->u.gsmHalfRate->comfortNoise,
- audioCap->u.gsmHalfRate->scrambled,
+ audioCap->u.gsmHalfRate->scrambled,
dir, NULL, NULL, NULL, NULL, TRUE);
case T_H245AudioCapability_gsmEnhancedFullRate:
- return ooCapabilityAddGSMCapability(call, OO_GSMENHANCEDFULLRATE,
+ return ooCapabilityAddGSMCapability(call, OO_GSMENHANCEDFULLRATE,
(unsigned)(audioCap->u.gsmEnhancedFullRate->audioUnitSize/OO_GSMFRAMESIZE),
audioCap->u.gsmEnhancedFullRate->comfortNoise,
- audioCap->u.gsmEnhancedFullRate->scrambled,
+ audioCap->u.gsmEnhancedFullRate->scrambled,
dir, NULL, NULL, NULL, NULL, TRUE);
default:
OOTRACEDBGA1("Unsupported audio capability type\n");
-
+
}
return OO_OK;
ooH323EpCapability * epCap = NULL, *cur = NULL;
OOTRACEDBGC3("checking whether we need to add cap to joint capabilities"
"(%s, %s)\n", call->callType, call->callToken);
-
+
switch(cap->t)
{
case T_H245Capability_receiveAudioCapability:
- epCap= ooIsAudioDataTypeSupported(call, cap->u.receiveAudioCapability,
+ epCap= ooIsAudioDataTypeSupported(call, cap->u.receiveAudioCapability,
OOTX);
break;
case T_H245Capability_transmitAudioCapability:
epCap = ooIsAudioDataTypeSupported(call, cap->u.transmitAudioCapability, OORX);
break;
case T_H245Capability_receiveVideoCapability:
- return ooCapabilityUpdateJointCapabilitiesVideo(call,
+ return ooCapabilityUpdateJointCapabilitiesVideo(call,
cap->u.receiveVideoCapability, OOTX);
case T_H245Capability_transmitVideoCapability:
- return ooCapabilityUpdateJointCapabilitiesVideo(call,
+ return ooCapabilityUpdateJointCapabilitiesVideo(call,
cap->u.transmitVideoCapability, OORX);
case T_H245Capability_receiveDataApplicationCapability:
- epCap= ooIsT38Supported(call, cap->u.receiveDataApplicationCapability,
+ epCap= ooIsT38Supported(call, cap->u.receiveDataApplicationCapability,
OOTX);
break;
case T_H245Capability_transmitDataApplicationCapability:
case T_H245Capability_receiveAndTransmitUserInputCapability:
- if((cap->u.receiveAndTransmitUserInputCapability->t ==
+ if((cap->u.receiveAndTransmitUserInputCapability->t ==
T_H245UserInputCapability_basicString) &&
(call->dtmfmode & OO_CAP_DTMF_H245_alphanumeric))
{
}
case T_H245Capability_receiveUserInputCapability:
- if((cap->u.receiveUserInputCapability->t ==
+ if((cap->u.receiveUserInputCapability->t ==
T_H245UserInputCapability_basicString) &&
(call->dtmfmode & OO_CAP_DTMF_H245_alphanumeric))
{
}
//break;
default:
- OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n",
+ OOTRACEDBGA3("Unsupported cap type encountered. Ignoring. (%s, %s)\n",
call->callType, call->callToken);
}
switch(videoCap->t)
{
case T_H245VideoCapability_h263VideoCapability:
- return ooCapabilityUpdateJointCapabilitiesVideoH263(call,
+ return ooCapabilityUpdateJointCapabilitiesVideoH263(call,
videoCap->u.h263VideoCapability, dir);
default:
OOTRACEDBGC3("ooCapabilityUpdateJointCapabilitiesVideo - Unsupported"
- "capability type. (%s, %s)\n", call->callType,
+ "capability type. (%s, %s)\n", call->callType,
call->callToken);
}
return OO_OK;
ooH323EpCapability *epCap = NULL, *cur = NULL;
if(pH263Cap->m.sqcifMPIPresent)
{
- epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
+ epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
OO_PICFORMAT_SQCIF);
if(epCap)
{
cur->next = epCap;
}
- }
+ }
}
epCap = NULL;
if(pH263Cap->m.qcifMPIPresent)
{
- epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
+ epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
OO_PICFORMAT_QCIF);
if(epCap)
{
cur->next = epCap;
}
- }
+ }
}
epCap = NULL;
if(pH263Cap->m.cifMPIPresent)
{
- epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
+ epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
OO_PICFORMAT_CIF);
if(epCap)
{
cur->next = epCap;
}
- }
+ }
}
epCap = NULL;
if(pH263Cap->m.cif4MPIPresent)
{
- epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
+ epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
OO_PICFORMAT_CIF4);
if(epCap)
{
while(cur->next) cur = cur->next;
cur->next = epCap;
}
- }
+ }
}
epCap = NULL;
if(pH263Cap->m.cif16MPIPresent)
{
- epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
+ epCap = ooIsVideoDataTypeH263Supported(call, pH263Cap, dir,
OO_PICFORMAT_CIF16);
if(epCap)
{
cur->next = epCap;
}
- }
+ }
}
return OO_OK;
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooCapability.h
- * This file contains Capability management functions.
+ * @file ooCapability.h
+ * This file contains Capability management functions.
*/
#ifndef OO_CAPABILITY_H_
#define OO_CAPABILITY_H_
#define OOTX (1<<1)
#define OORXANDTX (1<<2)
#define OORXTX (1<<3) /* For symmetric capabilities */
-/* Various types of caps. Note that not all
+/* Various types of caps. Note that not all
supported */
typedef enum OOCapabilities{
OO_CAP_AUDIO_BASE = 0,
/**
* This structure defines the preference order for capabilities.
- *
+ *
*/
typedef struct OOCapPrefs {
int order[20];
typedef struct OOCapParams {
int txframes; /*!< Number of frames per packet for transmission */
int rxframes; /*!< Number of frames per packet for reception */
- OOBOOL silenceSuppression;
+ OOBOOL silenceSuppression;
} OOCapParams;
typedef struct OOGSMCapParams {
- unsigned txframes;
+ unsigned txframes;
unsigned rxframes;
OOBOOL scrambled;
OOBOOL comfortNoise;
extern "C" {
#endif
-/**
+/**
* This callback is used for starting media receive channel. This callback
* function is triggered when receive media channel has to be started.
* @param call Call for which receive media channel has to be started.
(struct OOH323CallData *call, struct OOLogicalChannel *pChannel);
-/**
+/**
* This callback is used for starting media transmit channel. This callback
* function is triggered when transmit media channel has to be started.
* @param call Call for which transmit media channel has to be started.
typedef int (*cb_StartTransmitChannel)
(struct OOH323CallData *call, struct OOLogicalChannel *pChannel);
-/**
+/**
* This callback is used for stopping media receive channel. This callback
* function is triggered when receive media channel has to be stopped.
* @param call Call for which receive media channel has to be stopped.
typedef int (*cb_StopReceiveChannel)
(struct OOH323CallData *call, struct OOLogicalChannel *pChannel);
-/**
+/**
* This callback is used for stopping media transmit channel. This callback
* function is triggered when transmit media channel has to be stopped.
* @param call Call for which transmit media channel has to be stopped.
* capability
*/
typedef struct ooH323EpCapability {
- int dir;
+ int dir;
int cap;
OOCapType capType;
void *params;
#endif /* MAKE_DLL */
#endif /* EXTERN */
-/**
+/**
* @defgroup capmgmt Capability Management
* @{
*/
/**
* This function is used to add rfc2833 based dtmf detection capability
- * @param call Call if enabling for call, else null for
+ * @param call Call if enabling for call, else null for
* endpoint.
* @param dynamicRTPPayloadType dynamicRTPPayloadType to be used.
* @return OO_OK, on success. OO_FAILED, on failure.
/**
- * This function is used to enable support for H.245 based alphanumeric dtmf
+ * This function is used to enable support for H.245 based alphanumeric dtmf
* capability.
* @param call Handle to call, if enabling for the call, else NULL
* for end-point.
EXTERN int ooCapabilityEnableDTMFH245Alphanumeric(struct OOH323CallData *call);
/**
- * This function is used to disable support for H.245 based alphanumeric dtmf
+ * This function is used to disable support for H.245 based alphanumeric dtmf
* capability.
* @param call Handle to call, if disabling for the call, else NULL
* for end-point.
(struct OOH323CallData *call);
/**
- * This function is used to enable support for H.245 based signal dtmf
+ * This function is used to enable support for H.245 based signal dtmf
* capability.
* @param call Handle to call, if enabling for the call, else NULL
* for end-point.
EXTERN int ooCapabilityEnableDTMFH245Signal(struct OOH323CallData *call);
/**
- * This function is used to disable support for H.245 based signal dtmf
+ * This function is used to disable support for H.245 based signal dtmf
* capability.
* @param call Handle to call, if disabling for the call, else NULL
* for end-point.
/**
* This function is used to add simple capabilities which have only rxframes
- * and txframes parameters to the endpoint or call.(ex. G711, G728, G723.1,
+ * and txframes parameters to the endpoint or call.(ex. G711, G728, G723.1,
* G729)
- * @param call Handle to a call. If this is not Null, then
- * capability is added to call's remote enpoint
- * capability list, else it is added to local H323
+ * @param call Handle to a call. If this is not Null, then
+ * capability is added to call's remote enpoint
+ * capability list, else it is added to local H323
* endpoint list.
* @param cap Type of G711 capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param silenceSuppression Indicates support for silence suppression.
* Used only in case of g7231, otherwise ignored.
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooCapabilityAddSimpleCapability
- (struct OOH323CallData *call, int cap, int txframes, int rxframes,
- OOBOOL silenceSuppression, int dir,
+ (struct OOH323CallData *call, int cap, int txframes, int rxframes,
+ OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
* This is an internal helper function which is used to add a GSM capability
* to local endpoints capability list or to remote endpoints capability list or
* to a call's capability list.
- * @param call Handle to a call. If this is not Null, then
- * capability is added to call's remote enpoint
- * capability list, else it is added to local H323
+ * @param call Handle to a call. If this is not Null, then
+ * capability is added to call's remote enpoint
+ * capability list, else it is added to local H323
* endpoint list.
* @param cap Type of GSM capability to be added.
- * @param framesPerPkt Number of GSM frames per packet.
- * @param comfortNoise Comfort noise spec for the capability.
+ * @param framesPerPkt Number of GSM frames per packet.
+ * @param comfortNoise Comfort noise spec for the capability.
* @param scrambled Scrambled enabled/disabled for the capability.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
* @param remote TRUE, if adding call's remote capabilities.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-int ooCapabilityAddGSMCapability(struct OOH323CallData *call, int cap,
+int ooCapabilityAddGSMCapability(struct OOH323CallData *call, int cap,
unsigned framesPerPkt, OOBOOL comfortNoise,
- OOBOOL scrambled, int dir,
+ OOBOOL scrambled, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote);
/**
- * This function is used to add H263 video capability to local endpoints
- * capability list or to remote endpoints capability list or to a call's
+ * This function is used to add H263 video capability to local endpoints
+ * capability list or to remote endpoints capability list or to a call's
* capability list.
- * @param call Handle to a call. If this is not Null, then
- * capability is added to call's remote enpoint
- * capability list, else it is added to local H323
+ * @param call Handle to a call. If this is not Null, then
+ * capability is added to call's remote enpoint
+ * capability list, else it is added to local H323
* endpoint list.
- * @param sqcifMPI Minimum picture interval for encoding/decoding
+ * @param sqcifMPI Minimum picture interval for encoding/decoding
* of SQCIF pictures.
- * @param qcifMPI Minimum picture interval for encoding/decoding
+ * @param qcifMPI Minimum picture interval for encoding/decoding
* of QCIF pictures.
- * @param cifMPI Minimum picture interval for encoding/decoding
+ * @param cifMPI Minimum picture interval for encoding/decoding
* of CIF pictures.
- * @param cif4MPI Minimum picture interval for encoding/decoding
+ * @param cif4MPI Minimum picture interval for encoding/decoding
* of CIF4 pictures.
- * @param cif16MPI Minimum picture interval for encoding/decoding
+ * @param cif16MPI Minimum picture interval for encoding/decoding
* of CIF16 pictures.
* @param maxBitRate Maximum bit rate in units of 100 bits/s at
- * which a transmitter can transmit video or a
+ * which a transmitter can transmit video or a
* receiver can receive video.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
* @param remote TRUE, if adding call's remote capabilities.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooCapabilityAddH263VideoCapability(struct OOH323CallData *call,
- unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI,
+EXTERN int ooCapabilityAddH263VideoCapability(struct OOH323CallData *call,
+ unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI,
unsigned cif16MPI, unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote);
/**
* This function is an helper function to ooCapabilityAddH263VideoCapability.
- * @param call Handle to a call. If this is not Null, then
- * capability is added to call's remote enpoint
- * capability list, else it is added to local H323
+ * @param call Handle to a call. If this is not Null, then
+ * capability is added to call's remote enpoint
+ * capability list, else it is added to local H323
* endpoint list.
- * @param sqcifMPI Minimum picture interval for encoding/decoding
+ * @param sqcifMPI Minimum picture interval for encoding/decoding
* of SQCIF pictures.
- * @param qcifMPI Minimum picture interval for encoding/decoding
+ * @param qcifMPI Minimum picture interval for encoding/decoding
* of QCIF pictures.
- * @param cifMPI Minimum picture interval for encoding/decoding
+ * @param cifMPI Minimum picture interval for encoding/decoding
* of CIF pictures.
- * @param cif4MPI Minimum picture interval for encoding/decoding
+ * @param cif4MPI Minimum picture interval for encoding/decoding
* of CIF4 pictures.
- * @param cif16MPI Minimum picture interval for encoding/decoding
+ * @param cif16MPI Minimum picture interval for encoding/decoding
* of CIF16 pictures.
* @param maxBitRate Maximum bit rate in units of 100 bits/s at
- * which a transmitter can transmit video or a
+ * which a transmitter can transmit video or a
* receiver can receive video.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
* @param remote TRUE, if adding call's remote capabilities.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-int ooCapabilityAddH263VideoCapability_helper(struct OOH323CallData *call,
- unsigned sqcifMPI, unsigned qcifMPI,
- unsigned cifMPI, unsigned cif4MPI,
- unsigned cif16MPI, unsigned maxBitRate, int dir,
+int ooCapabilityAddH263VideoCapability_helper(struct OOH323CallData *call,
+ unsigned sqcifMPI, unsigned qcifMPI,
+ unsigned cifMPI, unsigned cif4MPI,
+ unsigned cif16MPI, unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
- cb_StopTransmitChannel stopTransmitChannel,
+ cb_StopTransmitChannel stopTransmitChannel,
OOBOOL remote);
/**
- * This function is used to add a audio capability to calls remote
+ * This function is used to add a audio capability to calls remote
* capability list.
* @param call Handle to the call.
* @param audioCap Handle to the remote endpoint's audio capability.
- * @param dir Direction in which capability is supported by
+ * @param dir Direction in which capability is supported by
* remote endpoint.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
/**
* This function is used to update joint capabilities for call. It checks
* whether remote capability can be supported by local capabilities for the
- * call and if supported makes entry into the joint capability list for the
+ * call and if supported makes entry into the joint capability list for the
* call.
* @param call Handle to the call
* @param cap Remote cap which will be tested for compatibility.
*
- * @return returns OO_OK, if updated else OO_FAILED;
+ * @return returns OO_OK, if updated else OO_FAILED;
*/
EXTERN int ooCapabilityUpdateJointCapabilities
(struct OOH323CallData* call, H245Capability *cap);
/**
* This function is used to update joint video capabilities for call. It checks
* whether remote capability can be supported by local capabilities for the
- * call and if supported makes entry into the joint capability list for the
+ * call and if supported makes entry into the joint capability list for the
* call.
* @param call Handle to the call
- * @param videoCap Remote video capability which will be tested for
+ * @param videoCap Remote video capability which will be tested for
* compatibility.
* @param dir Direction of the capability
*
- * @return returns OO_OK, if updated else OO_FAILED;
+ * @return returns OO_OK, if updated else OO_FAILED;
*/
EXTERN int ooCapabilityUpdateJointCapabilitiesVideo
(struct OOH323CallData *call, H245VideoCapability *videoCap, int dir);
/**
- * This function is used to update joint video H263 capabilities for call. It
- * checks whether remote capability can be supported by local capabilities for
+ * This function is used to update joint video H263 capabilities for call. It
+ * checks whether remote capability can be supported by local capabilities for
* the call and if supported makes entry into the joint capability list for the
* call.
* @param call Handle to the call
- * @param pH263Cap Remote H263 video capability which will be tested for
+ * @param pH263Cap Remote H263 video capability which will be tested for
* compatibility.
* @param dir Direction of the H263 capability
*
- * @return returns OO_OK, if updated else OO_FAILED;
+ * @return returns OO_OK, if updated else OO_FAILED;
*/
EXTERN int ooCapabilityUpdateJointCapabilitiesVideoH263
(struct OOH323CallData *call, H245H263VideoCapability *pH263Cap, int dir);
/**
- * This function is used to test whether the endpoint capability in the
+ * This function is used to test whether the endpoint capability in the
* specified direction can be supported by the audio capability.
* @param call Handle to the call.
* @param epCap Endpoint capability.
- * @param dataType Data type with which compatibility has to
+ * @param dataType Data type with which compatibility has to
* be tested.
* @param dir Direction indicating whether endpoint capability
* will be used for transmission or reception.
*
- * @return TRUE, if compatible. FALSE, otherwise.
+ * @return TRUE, if compatible. FALSE, otherwise.
*/
-ASN1BOOL ooCapabilityCheckCompatibility(struct OOH323CallData *call,
- ooH323EpCapability *epCap,
+ASN1BOOL ooCapabilityCheckCompatibility(struct OOH323CallData *call,
+ ooH323EpCapability *epCap,
H245DataType *dataType, int dir);
* This function is used to create a audio capability structure using the
* capability type.
* @param epCap Capability.
- * @param pctxt Handle to OOCTXT which will be used to allocate memory
+ * @param pctxt Handle to OOCTXT which will be used to allocate memory
* for new audio capability.
- * @param dir Direction in which the newly created capability will be
+ * @param dir Direction in which the newly created capability will be
* used.
*
- * @return Newly created audio capability on success, NULL on
+ * @return Newly created audio capability on success, NULL on
* failure.
*/
-struct H245AudioCapability* ooCapabilityCreateAudioCapability
+struct H245AudioCapability* ooCapabilityCreateAudioCapability
(ooH323EpCapability* epCap, OOCTXT *pctxt, int dir);
/**
* This function is used to create a video capability structure using the
* capability type.
* @param epCap Capability.
- * @param pctxt Handle to OOCTXT which will be used to allocate memory
+ * @param pctxt Handle to OOCTXT which will be used to allocate memory
* for new video capability.
- * @param dir Direction in which the newly created capability will be
+ * @param dir Direction in which the newly created capability will be
* used.
*
- * @return Newly created video capability on success, NULL on
+ * @return Newly created video capability on success, NULL on
* failure.
*/
struct H245VideoCapability* ooCapabilityCreateVideoCapability
* This function is used to create a dtmf capability which can be added to
* a TCS message.
* @param cap Type of dtmf capability to be created.
- * @param pctxt Pointer to OOCTXT structure to be used for memory
+ * @param pctxt Pointer to OOCTXT structure to be used for memory
* allocation.
*
* @return Pointer to the created DTMF capability, NULL in case of
* for new audio capability.
* @param dir Direction for the newly created capability.
*
- * @return Newly created audio capability on success, NULL on
+ * @return Newly created audio capability on success, NULL on
* failure.
*/
struct H245AudioCapability* ooCapabilityCreateGSMFullRateCapability
(ooH323EpCapability *epCap, OOCTXT* pctxt, int dir);
/**
- * This function is used to create a simple(g711, g728, g723.1, g729) audio
+ * This function is used to create a simple(g711, g728, g723.1, g729) audio
* capability structure.
*
* @param epCap Handle to the endpoint capability
- * @param pctxt Handle to OOCTXT which will be used to allocate memory
+ * @param pctxt Handle to OOCTXT which will be used to allocate memory
* for new audio capability.
- * @param dir Direction in which the newly created capability will be
+ * @param dir Direction in which the newly created capability will be
* used.
*
- * @return Newly created audio capability on success, NULL on
+ * @return Newly created audio capability on success, NULL on
* failure.
*/
struct H245AudioCapability* ooCapabilityCreateSimpleCapability
/**
- * This function is used to create a H263 video capability
+ * This function is used to create a H263 video capability
* structure.
* @param epCap Handle to the endpoint capability
- * @param pctxt Handle to OOCTXT which will be used to allocate memory
+ * @param pctxt Handle to OOCTXT which will be used to allocate memory
* for new video capability.
- * @param dir Direction in which the newly created capability will be
+ * @param dir Direction in which the newly created capability will be
* used.
*
- * @return Newly created video capability on success, NULL on
+ * @return Newly created video capability on success, NULL on
* failure.
*/
struct H245VideoCapability* ooCapabilityCreateH263VideoCapability
* can be supported by the endpoint.
* @param call Handle to the call.
* @param audioCap Handle to the audio capability.
- * @param dir Direction in which support is desired.
+ * @param dir Direction in which support is desired.
*
- * @return Handle to the copyof capability which supports audioCap,
+ * @return Handle to the copyof capability which supports audioCap,
* Null if none found
*/
ooH323EpCapability* ooIsAudioDataTypeSupported
* can be supported by the endpoint.
* @param call Handle to the call.
* @param pVideoCap Handle to the video capability.
- * @param dir Direction in which support is desired.
+ * @param dir Direction in which support is desired.
*
- * @return Handle to the copy of capability which supports video
+ * @return Handle to the copy of capability which supports video
* capability, Null if none found
*/
ooH323EpCapability* ooIsVideoDataTypeSupported
* can be supported by the endpoint.
* @param call Handle to the call.
* @param pH263Cap Handle to the H263 video capability.
- * @param dir Direction in which support is desired.
+ * @param dir Direction in which support is desired.
* @param picFormat Picture type(cif, qcif etc.)
*
- * @return Handle to the copy of capability which supports H263
+ * @return Handle to the copy of capability which supports H263
* capability, Null if none found
*/
ooH323EpCapability* ooIsVideoDataTypeH263Supported
- (struct OOH323CallData *call, H245H263VideoCapability* pH263Cap, int dir,
+ (struct OOH323CallData *call, H245H263VideoCapability* pH263Cap, int dir,
OOPictureFormat picFormat);
/**
* can be supported by the endpoint.
* @param call Handle to the call.
* @param data Handle to the capability type.
- * @param dir Direction in which support is desired.
+ * @param dir Direction in which support is desired.
*
- * @return Handle to the copy of capability which supports specified
+ * @return Handle to the copy of capability which supports specified
* capability type, Null if none found
*/
ooH323EpCapability* ooIsDataTypeSupported
EXTERN int ooAppendCapToCapPrefs(struct OOH323CallData *call, int cap);
/**
- * This function is used to change preference order of a particular capability
+ * This function is used to change preference order of a particular capability
* in the preference list.
* @param call Handle to call, if call's preference list has to be modified
* else NULL, to modify endpoint's preference list.
/**/
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
}
#endif
#endif
-
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return OO_FAILED;
}
ast_mutex_unlock(&gCmdChanLock);
-
+
return OO_OK;
}
int ooWriteCallStackCommand(OOH323CallData* call, OOStackCommand *cmd)
return OO_FAILED;
}
ast_mutex_unlock(call->CmdChanLock);
-
+
return OO_OK;
}
int ooReadAndProcessStackCommand()
{
- OOH323CallData *pCall = NULL;
+ OOH323CallData *pCall = NULL;
unsigned char buffer[MAXMSGLEN];
int i, recvLen = 0;
OOStackCommand cmd;
else {
switch(cmd.type) {
- case OO_CMD_MAKECALL:
- OOTRACEINFO2("Processing MakeCall command %s\n",
+ case OO_CMD_MAKECALL:
+ OOTRACEINFO2("Processing MakeCall command %s\n",
(char*)cmd.param2);
-
+
ooH323NewCall ((char*)cmd.param2);
break;
}
}
break;
-
+
case OO_CMD_ANSCALL:
pCall = ooFindCallByToken((char*)cmd.param1);
if(!pCall) {
ooH323ForwardCall((char*)cmd.param1, (char*)cmd.param2);
break;
- case OO_CMD_HANGCALL:
- OOTRACEINFO3("Processing Hang call command %s with q931 cause %d\n",
+ case OO_CMD_HANGCALL:
+ OOTRACEINFO3("Processing Hang call command %s with q931 cause %d\n",
(char*)cmd.param1, *(int *) cmd.param3);
- ooH323HangCall((char*)cmd.param1,
+ ooH323HangCall((char*)cmd.param1,
*(OOCallClearReason*)cmd.param2, *(int *) cmd.param3);
break;
-
+
case OO_CMD_SENDDIGIT:
pCall = ooFindCallByToken((char*)cmd.param1);
if(!pCall) {
break;
- case OO_CMD_STOPMONITOR:
+ case OO_CMD_STOPMONITOR:
OOTRACEINFO1("Processing StopMonitor command\n");
ooStopMonitorCalls();
break;
if (cmd.plen1 > 0) {
cmd.param1 = malloc(cmd.plen1 + 1);
- if (!cmd.param1)
+ if (!cmd.param1)
return OO_FAILED;
memset(cmd.param1, 0, cmd.plen1 + 1);
memcpy(cmd.param1, bPoint, cmd.plen1);
if (cmd.plen2 > 0) {
cmd.param2 = malloc(cmd.plen2 + 1);
- if (!cmd.param2)
+ if (!cmd.param2)
return OO_FAILED;
memset(cmd.param2, 0, cmd.plen2 + 1);
memcpy(cmd.param2, bPoint, cmd.plen2);
if (cmd.plen3 > 0) {
cmd.param3 = malloc(cmd.plen3 + 1);
- if (!cmd.param3)
+ if (!cmd.param3)
return OO_FAILED;
memset(cmd.param3, 0, cmd.plen3 + 1);
memcpy(cmd.param3, bPoint, cmd.plen3);
else {
switch(cmd.type) {
- case OO_CMD_MAKECALL:
- OOTRACEINFO2("Processing MakeCall command %s\n",
+ case OO_CMD_MAKECALL:
+ OOTRACEINFO2("Processing MakeCall command %s\n",
(char*)cmd.param2);
-
- ooH323MakeCall ((char*)cmd.param1, (char*)cmd.param2,
+
+ ooH323MakeCall ((char*)cmd.param1, (char*)cmd.param2,
(ooCallOptions*)cmd.param3);
break;
}
}
break;
-
+
case OO_CMD_ANSCALL:
ooSendConnect(call);
break;
ooH323ForwardCall((char*)cmd.param1, (char*)cmd.param2);
break;
- case OO_CMD_HANGCALL:
- OOTRACEINFO2("Processing Hang call command %s with q931 cause %d\n",
+ case OO_CMD_HANGCALL:
+ OOTRACEINFO2("Processing Hang call command %s with q931 cause %d\n",
(char*)cmd.param1);
- ooH323HangCall((char*)cmd.param1,
+ ooH323HangCall((char*)cmd.param1,
*(OOCallClearReason*)cmd.param2, *(int *) cmd.param3);
break;
-
+
case OO_CMD_SENDDIGIT:
if(call->jointDtmfMode & OO_CAP_DTMF_H245_alphanumeric) {
ooSendH245UserInputIndication_alphanumeric(
return OO_OK;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooCmdChannel.h
+ * @file ooCmdChannel.h
* This file contains stack commands which an user application can use to make
- * call, hang call etc.
+ * call, hang call etc.
*/
#ifndef OO_CMDCHANNEL_H
#define OO_DEFAULT_CMDLISTENER_PORT 7575
/**
- * @addtogroup channels
+ * @addtogroup channels
* @{
*/
/**
- * This function is used to setup a command connection with the main stack
- * thread. The application commands are sent over this connection to stack
+ * This function is used to setup a command connection with the main stack
+ * thread. The application commands are sent over this connection to stack
* thread.
*
* @return OO_OK, on success; OO_FAILED, on failure
EXTERN int ooCreateCallCmdConnection(OOH323CallData*);
/**
- * This function is used to close a command channel setup with the stack
+ * This function is used to close a command channel setup with the stack
* thread.
*
* @return OO_OK, on success; OO_FAILED, on failure
/**
- * This function is used by stack api to write stack commands to command
+ * This function is used by stack api to write stack commands to command
* channel.
*
* @return OO_OK, on success; OO_FAILED, on failure
EXTERN int ooWriteCallStackCommand(OOH323CallData* call, OOStackCommand *cmd);
/**
- * This function is used by stack thread to read and process stack commands
+ * This function is used by stack thread to read and process stack commands
* received over command channel.
*
* @return OO_OK, on success; OO_FAILED, on failure
EXTERN int ooReadAndProcessCallStackCommand(OOH323CallData*);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file ooCommon.h
+/**
+ * @file ooCommon.h
* Common runtime constant and type definitions.
*/
#ifndef _OOCOMMON_H_
#endif
#include <semaphore.h>
-/**
+/**
* @ingroup cruntime C Runtime Common Constant and Type Definitions.
* @{
*/
#endif /* _DLL */
#endif /* EXTERN */
-/**
- * @}
+/**
+ * @}
*/
#endif /* _OOCOMMON_H_ */
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
// Gets high resolution by spinning up to 15ms. Don't call this often!!!
static uint64 getRawCurMsSpin() {
- FILETIME tm;
+ FILETIME tm;
uint64 t_now;
static uint64 epocOffset = 0;
baselineMs = getRawCurMsSpin();
tickBaseline = timeGetTime();
}
-
+
uint64 now_ms = (baselineMs + (curTicks - tickBaseline));
*tv = oo_ms_to_tv(now_ms);
return 0;
long ooGetTimeDiff(struct timeval *tv1, struct timeval *tv2)
{
- return ( ((tv2->tv_sec-tv1->tv_sec)*1000) +
+ return ( ((tv2->tv_sec-tv1->tv_sec)*1000) +
((tv2->tv_usec-tv1->tv_usec)/1000) );
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file ooDateTime.h
+/**
+ * @file ooDateTime.h
* Time functions that reconcile differences between Windows and UNIX.
*/
#ifndef _OOTIME_H_
#endif
/**
- * This function provides an abstraction for the UNIX 'gettimeofday'
+ * This function provides an abstraction for the UNIX 'gettimeofday'
* function which is not available on Windows.
*
- * @param tv Pointer to time value structure to receive
+ * @param tv Pointer to time value structure to receive
* current time value.
* @param tz Point to time zone information.
* @return Completion status of operation: 0 = success,
* Copyright (C) 2005 by Page Iberica, S.A.
* Copyright (C) 2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooGkClient.c
- * This file contains functions to support RAS protocol.
+ * @file ooGkClient.c
+ * This file contains functions to support RAS protocol.
*
*/
#include "asterisk.h"
OOTRACEERR1("Error: Failed to allocate memory to Gatekeeper Client.\n");
return OO_FAILED;
}
-
+
memset(pGkClient, 0, sizeof(ooGkClient));
ast_mutex_init(&pGkClient->Lock);
gH323ep.gkClient = pGkClient;
return OO_FAILED;
}
}
-#endif
+#endif
if(OO_OK != ooGkClientSetGkMode(pGkClient, eGkMode, szGkAddr, iGkPort))
{
OOTRACEERR1("Error:Failed to set Gk mode\n");
memReset(&gH323ep.ctxt);
return OO_FAILED;
}
-
+
/* Create default parameter set */
pGkClient->grqTimeout = DEFAULT_GRQ_TIMEOUT;
pGkClient->rrqTimeout = DEFAULT_RRQ_TIMEOUT;
int ooGkClientSetCallbacks
(ooGkClient *pGkClient, OOGKCLIENTCALLBACKS callbacks)
{
- pGkClient->callbacks.onReceivedRegistrationConfirm =
+ pGkClient->callbacks.onReceivedRegistrationConfirm =
callbacks.onReceivedRegistrationConfirm;
- pGkClient->callbacks.onReceivedUnregistrationConfirm =
+ pGkClient->callbacks.onReceivedUnregistrationConfirm =
callbacks.onReceivedUnregistrationConfirm;
- pGkClient->callbacks.onReceivedUnregistrationRequest =
+ pGkClient->callbacks.onReceivedUnregistrationRequest =
callbacks.onReceivedUnregistrationRequest;
return OO_OK;
}
pGkClient->rrqRetries = 0;
pGkClient->grqRetries = 0;
pGkClient->requestSeqNum = 0;
-
+
dListFreeAll(&pGkClient->ctxt, &pGkClient->callsPendingList);
dListFreeAll(&pGkClient->ctxt, &pGkClient->callsAdmittedList);
dListFreeAll(&pGkClient->ctxt, &pGkClient->timerList);
if(pGkClient->gkMode == RasUseSpecificGatekeeper)
{
OOTRACEINFO1("\tGatekeeper mode - UseSpecificGatekeeper\n");
- OOTRACEINFO3("\tGatekeeper To Use - %s:%d\n", pGkClient->gkRasIP,
+ OOTRACEINFO3("\tGatekeeper To Use - %s:%d\n", pGkClient->gkRasIP,
pGkClient->gkRasPort);
}
else if(pGkClient->gkMode == RasDiscoverGatekeeper) {
OOTRACEERR1("Error: GkClient Channel Creation failed\n");
return OO_FAILED;
}
-
+
ast_mutex_lock(&pGkClient->Lock);
pGkClient->discoveryComplete = FALSE;
iRet = ooGkClientSendGRQ(pGkClient);
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
}
-
-int ooGkClientSetGkMode(ooGkClient *pGkClient, enum RasGatekeeperMode eGkMode,
+
+int ooGkClientSetGkMode(ooGkClient *pGkClient, enum RasGatekeeperMode eGkMode,
char *szGkAddr, int iGkPort )
{
pGkClient->gkMode = eGkMode;
if(szGkAddr)
{
if(strlen(szGkAddr)>MAX_IP_LEN)
- {
+ {
OOTRACEERR2("Error:Invalid IP address specified - %s\n", szGkAddr);
return OO_FAILED;
}
else
pGkClient->gkRasPort = DEFAULT_GKPORT;
- OOTRACEINFO3("Gatekeeper IP:port set to - %s:%d\n",
+ OOTRACEINFO3("Gatekeeper IP:port set to - %s:%d\n",
szGkAddr, pGkClient->gkRasPort);
}
else if(eGkMode == RasDiscoverGatekeeper) {
return OO_OK;
}
-
+
/**
* Create the RAS channel (socket).
*
if(pGkClient->localRASPort)
{
inet_pton(AF_INET, pGkClient->localRASIP, &ipaddrs);
- if( (ret=ooSocketBind( pGkClient->rasSocket, ipaddrs,
- pGkClient->localRASPort))!=ASN_OK )
+ if( (ret=ooSocketBind( pGkClient->rasSocket, ipaddrs,
+ pGkClient->localRASPort))!=ASN_OK )
{
OOTRACEERR1("ERROR:Failed to create RAS channel\n");
pGkClient->state = GkClientFailed;
{
OOTRACEDBGA1("Determining ip address for RAS channel "
"multihomed mode. \n");
- ret = ooSocketGetIpAndPort(pGkClient->rasSocket, pGkClient->localRASIP,
+ ret = ooSocketGetIpAndPort(pGkClient->rasSocket, pGkClient->localRASIP,
20, &pGkClient->localRASPort, NULL);
if(ret != ASN_OK)
{
return OO_FAILED;
}
OOTRACEDBGA3("Using local ip %s and port %d for RAS channel"
- "(multihomedMode).\n", pGkClient->localRASIP,
+ "(multihomedMode).\n", pGkClient->localRASIP,
pGkClient->localRASPort);
}
/* End of Test code */
if(gH323ep.productID)
{
pVendor->m.productIdPresent = TRUE;
- pVendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
+ pVendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
sizeof(pVendor->productId.data));
- memcpy(pVendor->productId.data, gH323ep.productID,
+ memcpy(pVendor->productId.data, gH323ep.productID,
pVendor->productId.numocts);
}
if(gH323ep.versionID)
{
pVendor->m.versionIdPresent = 1;
- pVendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
+ pVendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
sizeof(pVendor->versionId.data));
- memcpy(pVendor->versionId.data, gH323ep.versionID,
- pVendor->versionId.numocts);
+ memcpy(pVendor->versionId.data, gH323ep.versionID,
+ pVendor->versionId.numocts);
}
-}
+}
int ooGkClientReceive(ooGkClient *pGkClient)
OOCTXT *pctxt=NULL;
H225RasMessage *pRasMsg=NULL;
int iRet=OO_OK;
-
+
ast_mutex_lock(&pGkClient->Lock);
pctxt = &pGkClient->msgCtxt;
return OO_FAILED;
}
OOTRACEDBGA1("GkClient Received RAS Message\n");
-
+
/* Verify the gk */
if(pGkClient->discoveryComplete)
{
pGkClient->state = GkClientFailed;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
- }
+ }
pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage));
if(!pRasMsg)
{
int ooGkClientHandleRASMessage(ooGkClient *pGkClient, H225RasMessage *pRasMsg)
{
- int iRet = OO_OK;
+ int iRet = OO_OK;
switch( pRasMsg->t)
{
case T_H225RasMessage_gatekeeperConfirm:
OOTRACEINFO1("Gatekeeper Confirmed (GCF) message received.\n");
- iRet = ooGkClientHandleGatekeeperConfirm(pGkClient,
+ iRet = ooGkClientHandleGatekeeperConfirm(pGkClient,
pRasMsg->u.gatekeeperConfirm);
break;
- case T_H225RasMessage_gatekeeperReject:
+ case T_H225RasMessage_gatekeeperReject:
OOTRACEINFO1("Gatekeeper Reject (GRJ) message received\n");
- iRet = ooGkClientHandleGatekeeperReject(pGkClient,
+ iRet = ooGkClientHandleGatekeeperReject(pGkClient,
pRasMsg->u.gatekeeperReject);
break;
- case T_H225RasMessage_registrationConfirm:
+ case T_H225RasMessage_registrationConfirm:
OOTRACEINFO1("Registration Confirm (RCF) message received\n");
- iRet = ooGkClientHandleRegistrationConfirm(pGkClient,
+ iRet = ooGkClientHandleRegistrationConfirm(pGkClient,
pRasMsg->u.registrationConfirm );
break;
case T_H225RasMessage_registrationReject:
OOTRACEINFO1("Registration Reject (RRJ) message received.\n");
- iRet = ooGkClientHandleRegistrationReject(pGkClient,
+ iRet = ooGkClientHandleRegistrationReject(pGkClient,
pRasMsg->u.registrationReject);
break;
- case T_H225RasMessage_infoRequest:
+ case T_H225RasMessage_infoRequest:
//ooRasSendIRR( psRasMsg->sMessage.u.infoRequest->requestSeqNum );
break;
case T_H225RasMessage_admissionConfirm:
OOTRACEINFO1("Admission Confirm (ACF) message received\n");
- iRet = ooGkClientHandleAdmissionConfirm(pGkClient,
+ iRet = ooGkClientHandleAdmissionConfirm(pGkClient,
pRasMsg->u.admissionConfirm);
break;
case T_H225RasMessage_unregistrationRequest:
OOTRACEINFO1("UnRegistration Request (URQ) message received.\n");
- iRet = ooGkClientHandleUnregistrationRequest(pGkClient,
+ iRet = ooGkClientHandleUnregistrationRequest(pGkClient,
pRasMsg->u.unregistrationRequest);
break;
case T_H225RasMessage_unregistrationConfirm:
break;
case T_H225RasMessage_admissionReject:
OOTRACEINFO1("Admission Reject (ARJ) message received.\n");
- iRet = ooGkClientHandleAdmissionReject(pGkClient,
+ iRet = ooGkClientHandleAdmissionReject(pGkClient,
pRasMsg->u.admissionReject);
break;
case T_H225RasMessage_disengageConfirm:
- iRet = ooGkClientHandleDisengageConfirm(pGkClient,
+ iRet = ooGkClientHandleDisengageConfirm(pGkClient,
pRasMsg->u.disengageConfirm);
break;
case T_H225RasMessage_disengageReject:
{
OOCTXT ctxt;
H225RasMessage rasMsg;
- int ret;
+ int ret;
initContext(&ctxt);
setPERBuffer(&ctxt, msg, len, TRUE);
msgPtr = encodeGetMsgPtr( pctxt, &iLen );
/* If gatekeeper specified or have been discovered */
- if(pGkClient->gkMode == RasUseSpecificGatekeeper ||
+ if(pGkClient->gkMode == RasUseSpecificGatekeeper ||
pGkClient->discoveryComplete)
{
- if(ASN_OK != ooSocketSendTo( pGkClient->rasSocket, msgPtr, iLen,
+ if(ASN_OK != ooSocketSendTo( pGkClient->rasSocket, msgPtr, iLen,
pGkClient->gkRasIP, pGkClient->gkRasPort))
{
OOTRACEERR1("Error sending RAS message\n");
return OO_FAILED;
}
}
- else if(pGkClient->gkMode == RasDiscoverGatekeeper &&
- !pGkClient->discoveryComplete) {
- if(ASN_OK != ooSocketSendTo(pGkClient->rasSocket, msgPtr, iLen,
+ else if(pGkClient->gkMode == RasDiscoverGatekeeper &&
+ !pGkClient->discoveryComplete) {
+ if(ASN_OK != ooSocketSendTo(pGkClient->rasSocket, msgPtr, iLen,
MULTICAST_GKADDRESS, MULTICAST_GKPORT))
{
OOTRACEERR1("Error sending multicast RAS message\n" );
return OO_FAILED;
}
}
- else {/* should never go here */
+ else {/* should never go here */
OOTRACEERR1("Error: GkClient in invalid state.\n");
return OO_FAILED;
}
return OO_FAILED;
}
- pGkReq = (H225GatekeeperRequest*)memAlloc(pctxt,
+ pGkReq = (H225GatekeeperRequest*)memAlloc(pctxt,
sizeof(H225GatekeeperRequest));
if(!pGkReq)
{
pGkReq->protocolIdentifier = gProtocolID;
pGkReq->m.nonStandardDataPresent=0;
pGkReq->rasAddress.t=T_H225TransportAddress_ipAddress; /* IPv4 address */
- pRasAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
+ pRasAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
if(!pRasAddress)
{
return OO_FAILED;
}
-
+
inet_pton(AF_INET, pGkClient->localRASIP, pRasAddress->ip.data);
pRasAddress->ip.numocts = 4;
pGkReq->m.endpointAliasPresent=TRUE;
- if(OO_OK != ooPopulateAliasList(&pGkClient->msgCtxt, gH323ep.aliases,
+ if(OO_OK != ooPopulateAliasList(&pGkClient->msgCtxt, gH323ep.aliases,
&pGkReq->endpointAlias, 0))
{
OOTRACEERR1("Error Failed to fill alias information for GRQ message\n");
}
cbData->timerType = OO_GRQ_TIMER;
cbData->pGkClient = pGkClient;
- if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
- &ooGkClientGRQTimerExpired, pGkClient->grqTimeout,
- cbData, FALSE))
+ if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
+ &ooGkClientGRQTimerExpired, pGkClient->grqTimeout,
+ cbData, FALSE))
{
OOTRACEERR1("Error:Unable to create GRQ timer.\n ");
memFreePtr(&pGkClient->ctxt, cbData);
break;
}
}
-
+
pGkClient->state = GkClientGkErr;
switch(pGatekeeperReject->rejectReason.t)
{
return OO_OK;
}
- if(pGatekeeperConfirm->m.gatekeeperIdentifierPresent)
+ if(pGatekeeperConfirm->m.gatekeeperIdentifierPresent)
{
pGkClient->gkId.nchars = pGatekeeperConfirm->gatekeeperIdentifier.nchars;
if (pGkClient->gkId.data) {
return OO_FAILED;
}
- memcpy(pGkClient->gkId.data,
+ memcpy(pGkClient->gkId.data,
pGatekeeperConfirm->gatekeeperIdentifier.data,
sizeof(ASN116BITCHAR)* pGkClient->gkId.nchars);
}
"message\n");
pGkClient->gkId.nchars = 0;
}
-
+
/* Extract Gatekeeper's RAS address */
if(pGatekeeperConfirm->rasAddress.t != T_H225TransportAddress_ipAddress)
{
pRasAddress = pGatekeeperConfirm->rasAddress.u.ipAddress;
sprintf(pGkClient->gkRasIP, "%d.%d.%d.%d", pRasAddress->ip.data[0],
pRasAddress->ip.data[1],
- pRasAddress->ip.data[2],
+ pRasAddress->ip.data[2],
pRasAddress->ip.data[3]);
pGkClient->gkRasPort = pRasAddress->port;
-
+
pGkClient->discoveryComplete = TRUE;
pGkClient->state = GkClientDiscovered;
OOTRACEINFO1("Gatekeeper Confirmed\n");
return OO_FAILED;
}
- pRegReq = (H225RegistrationRequest*)memAlloc(pctxt,
+ pRegReq = (H225RegistrationRequest*)memAlloc(pctxt,
sizeof(H225RegistrationRequest));
if(!pRegReq)
{
memset(pRegReq, 0, sizeof(H225RegistrationRequest));
pRasMsg->t = T_H225RasMessage_registrationRequest;
pRasMsg->u.registrationRequest = pRegReq;
-
+
pRegReq->protocolIdentifier = gProtocolID;
pRegReq->m.nonStandardDataPresent=0;
/* Populate CallSignal Address List*/
- pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
+ pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress));
pIpAddress = (H225TransportAddress_ipAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data);
pIpAddress->ip.numocts = 4;
pIpAddress->port = gH323ep.listenPort;
-
+
dListInit(&pRegReq->callSignalAddress);
- dListAppend(pctxt, &pRegReq->callSignalAddress,
+ dListAppend(pctxt, &pRegReq->callSignalAddress,
(void*)pTransportAddress);
/* Populate RAS Address List*/
pTransportAddress = NULL;
pIpAddress = NULL;
- pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
+ pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress));
pIpAddress = (H225TransportAddress_ipAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
pTransportAddress->t = T_H225TransportAddress_ipAddress;
pTransportAddress->u.ipAddress = pIpAddress;
-
+
inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data);
pIpAddress->ip.numocts = 4;
pIpAddress->port = pGkClient->localRASPort;
-
+
dListInit(&pRegReq->rasAddress);
- dListAppend(pctxt, &pRegReq->rasAddress,
+ dListAppend(pctxt, &pRegReq->rasAddress,
(void*)pTransportAddress);
-
+
/* Pose as gateway or terminal as per config */
if(gH323ep.isGateway)
pRegReq->terminalType.m.gatewayPresent = TRUE;
pProtocol->t = T_H225SupportedProtocols_voice;
pProtocol->u.voice = pVoiceCaps;
-
+
dListInit(&pRegReq->terminalType.gateway.protocol);
- dListAppend(pctxt, &pRegReq->terminalType.gateway.protocol,
+ dListAppend(pctxt, &pRegReq->terminalType.gateway.protocol,
(void*)pProtocol);
}
pRegReq->m.terminalAliasPresent=TRUE;
- if(OO_OK != ooPopulateAliasList(pctxt, gH323ep.aliases,
+ if(OO_OK != ooPopulateAliasList(pctxt, gH323ep.aliases,
&pRegReq->terminalAlias, 0)) {
OOTRACEERR1("Error filling alias for RRQ\n");
- memReset(pctxt);
+ memReset(pctxt);
pGkClient->state = GkClientFailed;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
-
+
if (pGkClient->gkId.nchars) {
pRegReq->m.gatekeeperIdentifierPresent=TRUE;
pRegReq->gatekeeperIdentifier.nchars = pGkClient->gkId.nchars;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy(pRegReq->gatekeeperIdentifier.data, pGkClient->gkId.data,
+ memcpy(pRegReq->gatekeeperIdentifier.data, pGkClient->gkId.data,
pGkClient->gkId.nchars*sizeof(ASN116BITCHAR));
}
-
+
ooGkClientFillVendor(pGkClient, &pRegReq->endpointVendor);
-
+
pRegReq->m.willSupplyUUIEsPresent=TRUE;
pRegReq->willSupplyUUIEs=FALSE;
pRegReq->requestSeqNum = pGkClient->requestSeqNum++;
if(!pRegReq->requestSeqNum)
pRegReq->requestSeqNum = pGkClient->requestSeqNum++;
-
+
pRegReq->discoveryComplete= pGkClient->discoveryComplete;
pRegReq->m.keepAlivePresent=TRUE;
pRegReq->keepAlive= keepAlive;
/* KeepAlive, re-registration message...
allocate storage for endpoint-identifier, and populate it from what the
GK told us from the previous RCF. Only allocate on the first pass thru here */
- pRegReq->endpointIdentifier.data =
+ pRegReq->endpointIdentifier.data =
(ASN116BITCHAR*)memAlloc(pctxt, pGkClient->endpointId.nchars*sizeof(ASN116BITCHAR));
if (pRegReq->endpointIdentifier.data) {
pRegReq->endpointIdentifier.nchars = pGkClient->endpointId.nchars;
}
cbData->timerType = OO_RRQ_TIMER;
cbData->pGkClient = pGkClient;
- if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
- &ooGkClientRRQTimerExpired, pGkClient->rrqTimeout,
- cbData, FALSE))
+ if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
+ &ooGkClientRRQTimerExpired, pGkClient->rrqTimeout,
+ cbData, FALSE))
{
OOTRACEERR1("Error:Unable to create GRQ timer.\n ");
memFreePtr(&pGkClient->ctxt, cbData);
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
-
+
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
}
/* Extract Endpoint Id */
if (pGkClient->endpointId.data)
memFreePtr(&pGkClient->ctxt, pGkClient->endpointId.data);
- pGkClient->endpointId.nchars =
+ pGkClient->endpointId.nchars =
pRegistrationConfirm->endpointIdentifier.nchars;
pGkClient->endpointId.data = (ASN116BITCHAR*)memAlloc(&pGkClient->ctxt,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
pGkClient->state = GkClientFailed;
return OO_FAILED;
}
-
- memcpy(pGkClient->endpointId.data,
+
+ memcpy(pGkClient->endpointId.data,
pRegistrationConfirm->endpointIdentifier.data,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
/* Extract GK Identifier */
-
+
if(pRegistrationConfirm->m.gatekeeperIdentifierPresent && pGkClient->gkId.nchars == 0)
{
pGkClient->gkId.nchars = pRegistrationConfirm->gatekeeperIdentifier.nchars;
return OO_FAILED;
}
- memcpy(pGkClient->gkId.data,
+ memcpy(pGkClient->gkId.data,
pRegistrationConfirm->gatekeeperIdentifier.data,
sizeof(ASN116BITCHAR)* pGkClient->gkId.nchars);
}
{
OOTRACEERR1("Error:Invalid Registration confirmed message\n");
OOTRACEINFO1("Ignoring RCF, will retransmit RRQ after timeout\n");
- return OO_FAILED;
+ return OO_FAILED;
}
pCallSigAddr = (H225TransportAddress*)pNode->data;
if(pCallSigAddr->t != T_H225TransportAddress_ipAddress)
continue;
- sprintf(pGkClient->gkCallSignallingIP, "%d.%d.%d.%d",
+ sprintf(pGkClient->gkCallSignallingIP, "%d.%d.%d.%d",
pCallSigAddr->u.ipAddress->ip.data[0],
pCallSigAddr->u.ipAddress->ip.data[1],
pCallSigAddr->u.ipAddress->ip.data[2],
pCallSigAddr->u.ipAddress->ip.data[3]);
pGkClient->gkCallSignallingPort = pCallSigAddr->u.ipAddress->port;
}
-
+
/* Update list of registered aliases*/
if(pRegistrationConfirm->m.terminalAliasPresent)
{
- ooGkClientUpdateRegisteredAliases(pGkClient,
+ ooGkClientUpdateRegisteredAliases(pGkClient,
&pRegistrationConfirm->terminalAlias, TRUE);
}
else{/* Everything registered*/
}
cbData->timerType = OO_REG_TIMER;
cbData->pGkClient = pGkClient;
- if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
- &ooGkClientREGTimerExpired, regTTL,
+ if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
+ &ooGkClientREGTimerExpired, regTTL,
cbData, FALSE))
{
OOTRACEERR1("Error:Unable to create REG timer.\n ");
memFreePtr(&pGkClient->ctxt, cbData);
pGkClient->state = GkClientFailed;
return OO_FAILED;
- }
-
+ }
+
}
else{
pGkClient->regTimeout = 0;
/* Extract Pre-Granted ARQ */
if(pRegistrationConfirm->m.preGrantedARQPresent)
{
- memcpy(&pGkClient->gkInfo.preGrantedARQ,
+ memcpy(&pGkClient->gkInfo.preGrantedARQ,
&pRegistrationConfirm->preGrantedARQ,
sizeof(H225RegistrationConfirm_preGrantedARQ));
}
return OO_FAILED;
}
- pUnregReq = (H225UnregistrationRequest*)memAlloc(pctxt,
+ pUnregReq = (H225UnregistrationRequest*)memAlloc(pctxt,
sizeof(H225UnregistrationRequest));
if(!pUnregReq)
{
if(!pUnregReq->requestSeqNum)
pUnregReq->requestSeqNum = pGkClient->requestSeqNum++;
-
+
/* Populate CallSignal Address List*/
- pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
+ pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress));
pIpAddress = (H225TransportAddress_ipAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
inet_pton(AF_INET, pGkClient->localRASIP, pIpAddress->ip.data);
pIpAddress->ip.numocts = 4;
pIpAddress->port = gH323ep.listenPort;
-
+
dListInit(&pUnregReq->callSignalAddress);
- dListAppend(pctxt, &pUnregReq->callSignalAddress,
+ dListAppend(pctxt, &pUnregReq->callSignalAddress,
(void*)pTransportAddress);
/* Populate Endpoint Identifier */
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy((void*)pUnregReq->endpointIdentifier.data,
+ memcpy((void*)pUnregReq->endpointIdentifier.data,
(void*)pGkClient->endpointId.data,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy((void*)pUnregReq->gatekeeperIdentifier.data,
- (void*)pGkClient->gkId.data,
- sizeof(ASN116BITCHAR)*pGkClient->gkId.nchars);
+ memcpy((void*)pUnregReq->gatekeeperIdentifier.data,
+ (void*)pGkClient->gkId.data,
+ sizeof(ASN116BITCHAR)*pGkClient->gkId.nchars);
}
/* Check whether specific aliases are to be unregistered*/
ooPopulateAliasList(pctxt, aliases, &pUnregReq->endpointAlias, 0);
}
-
+
iRet = ooGkClientSendMsg(pGkClient, pRasMsg);
if(iRet != OO_OK)
{
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
-}
+}
int iRet=0, x;
OOTimer *pTimer = NULL;
DListNode *pNode = NULL;
-
+
/* Lets first send unregistration confirm message back to gatekeeper*/
- ooGkClientSendUnregistrationConfirm(pGkClient,
+ ooGkClientSendUnregistrationConfirm(pGkClient,
punregistrationRequest->requestSeqNum);
if(punregistrationRequest->m.endpointAliasPresent)
{
OOTRACEINFO1("Gatekeeper requested a list of aliases be unregistered\n");
- ooGkClientUpdateRegisteredAliases(pGkClient,
+ ooGkClientUpdateRegisteredAliases(pGkClient,
&punregistrationRequest->endpointAlias, FALSE);
}
else{
}
}
- iRet = ooGkClientSendRRQ(pGkClient, 0);
+ iRet = ooGkClientSendRRQ(pGkClient, 0);
if(iRet != OO_OK)
{
OOTRACEERR1("Error: Failed to send RRQ message\n");
int ooGkClientSendUnregistrationConfirm(ooGkClient *pGkClient, unsigned reqNo)
{
int iRet = OO_OK;
- OOCTXT *pctxt = &pGkClient->msgCtxt;
+ OOCTXT *pctxt = &pGkClient->msgCtxt;
H225RasMessage *pRasMsg=NULL;
H225UnregistrationConfirm *pUCF=NULL;
ast_mutex_lock(&pGkClient->Lock);
pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage));
- pUCF = (H225UnregistrationConfirm*)memAlloc(pctxt,
+ pUCF = (H225UnregistrationConfirm*)memAlloc(pctxt,
sizeof(H225UnregistrationConfirm));
if(!pRasMsg || !pUCF)
{
pRasMsg->t = T_H225RasMessage_unregistrationConfirm;
pRasMsg->u.unregistrationConfirm = pUCF;
memset(pUCF, 0, sizeof(H225UnregistrationConfirm));
-
+
pUCF->requestSeqNum = reqNo;
-
+
iRet = ooGkClientSendMsg(pGkClient, pRasMsg);
if(iRet != OO_OK)
{
ast_mutex_lock(&pGkClient->Lock);
- OOTRACEDBGA3("Building Admission Request for call (%s, %s)\n",
- call->callType, call->callToken);
+ OOTRACEDBGA3("Building Admission Request for call (%s, %s)\n",
+ call->callType, call->callToken);
pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage));
if(!pRasMsg)
{
return OO_FAILED;
}
pRasMsg->t = T_H225RasMessage_admissionRequest;
- pAdmReq = (H225AdmissionRequest*) memAlloc(pctxt,
+ pAdmReq = (H225AdmissionRequest*) memAlloc(pctxt,
sizeof(H225AdmissionRequest));
if(!pAdmReq)
{
}
memset(pAdmReq, 0, sizeof(H225AdmissionRequest));
pRasMsg->u.admissionRequest = pAdmReq;
-
+
/* Populate call signalling addresses */
- pIpAddressLocal = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
+ pIpAddressLocal = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
if(!ooUtilsIsStrEmpty(call->remoteIP))
- pIpAddressRemote = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
+ pIpAddressRemote = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
if(!pIpAddressLocal || (!ooUtilsIsStrEmpty(call->remoteIP) && (!pIpAddressRemote)))
/* Populate call type - For now only PointToPoint supported*/
pAdmReq->callType.t = T_H225CallType_pointToPoint;
-
+
/* Add call model to message*/
pAdmReq->m.callModelPresent = 1;
if(OO_TESTFLAG(call->flags, OO_M_GKROUTED))
if(!pAdmReq->endpointIdentifier.data)
{
OOTRACEERR3("Error:Memory - ooGkClientSendAdmissionRequest - "
- "endpointIdentifier.data(%s, %s)\n", call->callType,
+ "endpointIdentifier.data(%s, %s)\n", call->callType,
call->callToken);
memReset(pctxt);
pGkClient->state = GkClientFailed;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy((void*)pAdmReq->endpointIdentifier.data,
+ memcpy((void*)pAdmReq->endpointIdentifier.data,
(void*)pGkClient->endpointId.data,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
/* Get Destination And source aliases for call - */
if(!strcmp(call->callType, "incoming"))
{
- if(call->ourAliases)
+ if(call->ourAliases)
destAliases = call->ourAliases;
else
- destAliases = gH323ep.aliases;
+ destAliases = gH323ep.aliases;
srcAliases = call->remoteAliases;
}
else {
- if(call->ourAliases)
+ if(call->ourAliases)
srcAliases = call->ourAliases;
else
- srcAliases = gH323ep.aliases;
+ srcAliases = gH323ep.aliases;
destAliases = call->remoteAliases;
}
return OO_FAILED;
}
}
-
+
/* Populate bandwidth*/
pAdmReq->bandWidth = DEFAULT_BW_REQUEST;
/* Populate call Reference */
pAdmReq->callReferenceValue = call->callReference;
-
+
/* populate conferenceID */
memcpy((void*)&pAdmReq->conferenceID, (void*)&call->confIdentifier,
sizeof(H225ConferenceIdentifier));
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy((void*)pAdmReq->gatekeeperIdentifier.data,
- (void*)pGkClient->gkId.data,
+ memcpy((void*)pAdmReq->gatekeeperIdentifier.data,
+ (void*)pGkClient->gkId.data,
sizeof(ASN116BITCHAR)*pGkClient->gkId.nchars);
}
/* Create RasCallAdmissionInfo */
if(!retransmit)
{
- pCallAdmInfo = (RasCallAdmissionInfo*)memAlloc(&pGkClient->ctxt,
+ pCallAdmInfo = (RasCallAdmissionInfo*)memAlloc(&pGkClient->ctxt,
sizeof(RasCallAdmissionInfo));
if(!pCallAdmInfo)
{
pGkClient->state = GkClientFailed;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
- }
+ }
pCallAdmInfo->call = call;
pCallAdmInfo->retries = 0;
}
}
}
-
+
iRet = ooGkClientSendMsg(pGkClient, pRasMsg);
if(iRet != OO_OK)
{
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- OOTRACEINFO3("Admission Request message sent for (%s, %s)\n",
+ OOTRACEINFO3("Admission Request message sent for (%s, %s)\n",
call->callType, call->callToken);
memReset(pctxt);
-
+
/* Add ARQ timer */
cbData = (ooGkClientTimerCb*) memAlloc
(&pGkClient->ctxt, sizeof(ooGkClientTimerCb));
cbData->timerType = OO_ARQ_TIMER;
cbData->pGkClient = pGkClient;
cbData->pAdmInfo = pCallAdmInfo;
- if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
- &ooGkClientARQTimerExpired, pGkClient->arqTimeout,
+ if(!ooTimerCreate(&pGkClient->ctxt, &pGkClient->timerList,
+ &ooGkClientARQTimerExpired, pGkClient->arqTimeout,
cbData, FALSE))
{
OOTRACEERR1("Error:Unable to create ARQ timer.\n ");
pGkClient->state = GkClientFailed;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
- }
-
+ }
+
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
}
pCallAdmInfo = (RasCallAdmissionInfo*) pNode->data;
if(pCallAdmInfo->requestSeqNum == pAdmissionConfirm->requestSeqNum)
{
- OOTRACEDBGC3("Found Pending call(%s, %s)\n",
- pCallAdmInfo->call->callType,
+ OOTRACEDBGC3("Found Pending call(%s, %s)\n",
+ pCallAdmInfo->call->callType,
pCallAdmInfo->call->callToken);
ast_mutex_lock(&pCallAdmInfo->call->GkLock);
/* Populate Remote IP */
- if(pAdmissionConfirm->destCallSignalAddress.t !=
+ if(pAdmissionConfirm->destCallSignalAddress.t !=
T_H225TransportAddress_ipAddress)
{
OOTRACEERR1("Error:Destination Call Signal Address provided by"
return OO_FAILED;
}
ipAddress = pAdmissionConfirm->destCallSignalAddress.u.ipAddress;
-
+
sprintf(ip, "%d.%d.%d.%d", ipAddress->ip.data[0],
ipAddress->ip.data[1],
ipAddress->ip.data[2],
OO_CLRFLAG(pCallAdmInfo->call->flags, OO_M_GKROUTED);
}
}
-
+
if(pAdmissionConfirm->callModel.t == T_H225CallModel_gatekeeperRouted)
{
if(!OO_TESTFLAG(pCallAdmInfo->call->flags, OO_M_GKROUTED))
{
OOTRACEINFO3("Gatekeeper changed call model from direct to "
- "GkRouted. (%s, %s)\n",
+ "GkRouted. (%s, %s)\n",
pCallAdmInfo->call->callType,
pCallAdmInfo->call->callToken);
OO_SETFLAG(pCallAdmInfo->call->flags, OO_M_GKROUTED);
pTimer = (OOTimer*)pNode1->data;
if(((ooGkClientTimerCb*)pTimer->cbData)->timerType & OO_ARQ_TIMER)
{
- if(((ooGkClientTimerCb*)pTimer->cbData)->pAdmInfo ==
+ if(((ooGkClientTimerCb*)pTimer->cbData)->pAdmInfo ==
pCallAdmInfo)
{
memFreePtr(&pGkClient->ctxt, pTimer->cbData);
- ooTimerDelete(&pGkClient->ctxt, &pGkClient->timerList,
+ ooTimerDelete(&pGkClient->ctxt, &pGkClient->timerList,
pTimer);
OOTRACEDBGA1("Deleted ARQ Timer.\n");
break;
}
}
- }
- OOTRACEINFO3("Admission Confirm message received for (%s, %s)\n",
- pCallAdmInfo->call->callType,
+ }
+ OOTRACEINFO3("Admission Confirm message received for (%s, %s)\n",
+ pCallAdmInfo->call->callType,
pCallAdmInfo->call->callToken);
pCallAdmInfo->call->callState = OO_CALL_CONNECTING;
dListRemove(&pGkClient->callsPendingList, pNode);
- dListAppend(&pGkClient->ctxt, &pGkClient->callsAdmittedList,
+ dListAppend(&pGkClient->ctxt, &pGkClient->callsAdmittedList,
pNode->data);
memFreePtr(&pGkClient->ctxt, pNode);
ast_mutex_unlock(&pCallAdmInfo->call->GkLock);
if(!pCallAdmInfo)
{
OOTRACEWARN2("Received admission reject with request number %d can not"
- " be matched with any pending call.\n",
+ " be matched with any pending call.\n",
pAdmissionReject->requestSeqNum);
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
pTimer = (OOTimer*)pNode1->data;
if(((ooGkClientTimerCb*)pTimer->cbData)->timerType & OO_ARQ_TIMER)
{
- if(((ooGkClientTimerCb*)pTimer->cbData)->pAdmInfo ==
+ if(((ooGkClientTimerCb*)pTimer->cbData)->pAdmInfo ==
pCallAdmInfo)
{
memFreePtr(&pGkClient->ctxt, pTimer->cbData);
- ooTimerDelete(&pGkClient->ctxt, &pGkClient->timerList,
+ ooTimerDelete(&pGkClient->ctxt, &pGkClient->timerList,
pTimer);
OOTRACEDBGA1("Deleted ARQ Timer.\n");
break;
}
}
- }
+ }
OOTRACEINFO4("Admission Reject message received with reason code %d for "
"(%s, %s)\n", pAdmissionReject->rejectReason.t, call->callType,
call->callToken);
-
+
call->callState = OO_CALL_CLEARED;
switch(pAdmissionReject->rejectReason.t)
ast_mutex_unlock(&pCallAdmInfo->call->GkLock);
ast_mutex_unlock(&pGkClient->Lock);
ast_cond_signal(&pCallAdmInfo->call->gkWait);
- return OO_OK;
+ return OO_OK;
}
ast_mutex_lock(&pGkClient->Lock);
- OOTRACEDBGA3("Building Info Request Resp for call (%s, %s)\n",
- call->callType, call->callToken);
+ OOTRACEDBGA3("Building Info Request Resp for call (%s, %s)\n",
+ call->callType, call->callToken);
pRasMsg = (H225RasMessage*)memAlloc(pctxt, sizeof(H225RasMessage));
if(!pRasMsg)
{
return OO_FAILED;
}
pRasMsg->t = T_H225RasMessage_infoRequestResponse;
- pIRR = (H225InfoRequestResponse*) memAlloc(pctxt,
+ pIRR = (H225InfoRequestResponse*) memAlloc(pctxt,
sizeof(H225InfoRequestResponse));
if(!pIRR)
{
}
memset(pIRR, 0, sizeof(H225InfoRequestResponse));
pRasMsg->u.infoRequestResponse = pIRR;
-
+
/* Populate call signalling addresses */
- pIpAddressLocal = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
+ pIpAddressLocal = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
pTransportAddress = (H225TransportAddress*) memAlloc(pctxt,
sizeof(H225TransportAddress));
if(!pIRR->requestSeqNum)
pIRR->requestSeqNum = pGkClient->requestSeqNum++;
- pIpRasAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
+ pIpRasAddress = (H225TransportAddress_ipAddress*)memAlloc(pctxt,
sizeof(H225TransportAddress_ipAddress));
if(!pIpRasAddress)
{
/* Populate call aliases */
- if(call->ourAliases)
+ if(call->ourAliases)
srcAliases = call->ourAliases;
else
- srcAliases = gH323ep.aliases;
+ srcAliases = gH323ep.aliases;
/* Populate Source Info */
if(srcAliases)
pIRR->m.needResponsePresent = TRUE;
pIRR->unsolicited = TRUE;
pIRR->m.unsolicitedPresent = TRUE;
-
+
/* Populate perCallInfo */
pIRR->m.perCallInfoPresent = TRUE;
- perCallInfo =
+ perCallInfo =
(H225InfoRequestResponse_perCallInfo_element *)memAlloc(pctxt,
sizeof(H225InfoRequestResponse_perCallInfo_element));
memset(perCallInfo, 0, sizeof(H225InfoRequestResponse_perCallInfo_element));
pRemoteAddr->port = call->remotePort;
perCallInfo->callSignaling.m.sendAddressPresent = TRUE;
- perCallInfo->callSignaling.sendAddress.t = T_H225TransportAddress_ipAddress;
+ perCallInfo->callSignaling.sendAddress.t = T_H225TransportAddress_ipAddress;
perCallInfo->callSignaling.m.recvAddressPresent = TRUE;
- perCallInfo->callSignaling.recvAddress.t = T_H225TransportAddress_ipAddress;
+ perCallInfo->callSignaling.recvAddress.t = T_H225TransportAddress_ipAddress;
if (!strcmp(call->callType, "incoming")) {
// terminator
}
perCallInfo->usageInformation.m.endTimePresent = FALSE;
perCallInfo->m.usageInformationPresent = TRUE;
-
+
dListInit(&pIRR->perCallInfo);
dListAppend(pctxt, &pIRR->perCallInfo,
(void*)perCallInfo);
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- OOTRACEINFO3("IRR message sent for (%s, %s)\n",
+ OOTRACEINFO3("IRR message sent for (%s, %s)\n",
call->callType, call->callToken);
memReset(pctxt);
-
+
ast_mutex_unlock(&pGkClient->Lock);
return OO_OK;
}
/**
- * This function is invoked to request call disengage to gatekeeper.
- *
- * @param szCallToken Call token.
+ * This function is invoked to request call disengage to gatekeeper.
+ *
+ * @param szCallToken Call token.
*
* @return Completion status - 0 on success, -1 on failure
*/
int ooGkClientSendDisengageRequest(ooGkClient *pGkClient, OOH323CallData *call)
{
- int iRet = 0;
+ int iRet = 0;
unsigned int x;
H225RasMessage *pRasMsg=NULL;
OOCTXT *pctxt = NULL;
}
pRasMsg->t = T_H225RasMessage_disengageRequest;
- pDRQ = (H225DisengageRequest*) memAlloc(pctxt,
+ pDRQ = (H225DisengageRequest*) memAlloc(pctxt,
sizeof(H225DisengageRequest));
if(!pDRQ)
{
memset(pDRQ, 0, sizeof(H225DisengageRequest));
pRasMsg->u.disengageRequest = pDRQ;
-
+
pDRQ->requestSeqNum = pGkClient->requestSeqNum++;
if(!pDRQ->requestSeqNum )
pDRQ->requestSeqNum = pGkClient->requestSeqNum++;
-
-
+
+
pDRQ->endpointIdentifier.nchars = pGkClient->endpointId.nchars;
pDRQ->endpointIdentifier.data = (ASN116BITCHAR*)memAlloc(pctxt,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy((void*)pDRQ->endpointIdentifier.data,
- (void*)pGkClient->endpointId.data,
+ memcpy((void*)pDRQ->endpointIdentifier.data,
+ (void*)pGkClient->endpointId.data,
sizeof(ASN116BITCHAR)*pGkClient->endpointId.nchars);
memcpy((void*)&pDRQ->conferenceID, (void*)&call->confIdentifier,
sizeof(H225ConferenceIdentifier));
pDRQ->callReferenceValue = call->callReference;
-
+
pDRQ->disengageReason.t = T_H225DisengageReason_normalDrop;
pDRQ->m.answeredCallPresent = 1;
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- memcpy(pDRQ->gatekeeperIdentifier.data, pGkClient->gkId.data,
+ memcpy(pDRQ->gatekeeperIdentifier.data, pGkClient->gkId.data,
pGkClient->gkId.nchars*sizeof(ASN116BITCHAR));
}
pDRQ->m.terminationCausePresent = 1;
pDRQ->terminationCause.t = T_H225CallTerminationCause_releaseCompleteCauseIE;
- pDRQ->terminationCause.u.releaseCompleteCauseIE =
+ pDRQ->terminationCause.u.releaseCompleteCauseIE =
(H225CallTerminationCause_releaseCompleteCauseIE*)memAlloc(pctxt,
sizeof(H225CallTerminationCause_releaseCompleteCauseIE));
if(!pDRQ->terminationCause.u.releaseCompleteCauseIE)
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
- pDRQ->terminationCause.u.releaseCompleteCauseIE->numocts =
+ pDRQ->terminationCause.u.releaseCompleteCauseIE->numocts =
strlen("Call Ended");
strcpy((char *)pDRQ->terminationCause.u.releaseCompleteCauseIE->data, "Call Ended");
OOTRACEERR1("Error: Failed to send DRQ message\n");
pGkClient->state = GkClientGkErr;
}
-
+
/* Search call in admitted calls list */
}
ast_mutex_unlock(&pGkClient->Lock);
return iRet;
-}
+}
int ooGkClientHandleDisengageConfirm
(ooGkClient *pGkClient, H225DisengageConfirm *pDCF)
ooGkClientTimerCb *cbData = (ooGkClientTimerCb*)pdata;
ooGkClient *pGkClient = cbData->pGkClient;
OOTRACEDBGA1("Gatekeeper client RRQ timer expired.\n");
-
+
if(pGkClient->rrqRetries < OO_MAX_RRQ_RETRIES)
{
- ret = ooGkClientSendRRQ(pGkClient, 0);
+ ret = ooGkClientSendRRQ(pGkClient, 0);
if(ret != OO_OK)
{
OOTRACEERR1("Error:Failed to send RRQ message\n");
-
+
return OO_FAILED;
}
pGkClient->rrqRetries++;
OOTRACEDBGA1("Gatekeeper client GRQ timer expired.\n");
- memFreePtr(&pGkClient->ctxt, cbData);
+ memFreePtr(&pGkClient->ctxt, cbData);
if(pGkClient->grqRetries < OO_MAX_GRQ_RETRIES)
{
- ret = ooGkClientSendGRQ(pGkClient);
+ ret = ooGkClientSendGRQ(pGkClient);
if(ret != OO_OK)
{
OOTRACEERR1("Error:Failed to send GRQ message\n");
ast_mutex_unlock(&pGkClient->Lock);
return OO_FAILED;
}
-
+
/* clear grq counter */
pGkClient->grqRetries = 0;
return OO_FAILED;
}
-
+
int ooGkClientREGTimerExpired(void *pdata)
{
int ret=0;
ooGkClientTimerCb *cbData = (ooGkClientTimerCb*)pdata;
ooGkClient *pGkClient = cbData->pGkClient;
OOTRACEDBGA1("Gatekeeper client additive registration timer expired\n");
- memFreePtr(&pGkClient->ctxt, cbData);
- ret = ooGkClientSendRRQ(pGkClient, TRUE);
+ memFreePtr(&pGkClient->ctxt, cbData);
+ ret = ooGkClientSendRRQ(pGkClient, TRUE);
if(ret != OO_OK)
{
OOTRACEERR1("Error:Failed to send Additive RRQ message\n");
RasCallAdmissionInfo *pAdmInfo = cbData->pAdmInfo;
OOTRACEDBGA1("Gatekeeper client ARQ timer expired.\n");
- memFreePtr(&pGkClient->ctxt, cbData);
+ memFreePtr(&pGkClient->ctxt, cbData);
if(!pAdmInfo)
return OO_OK;
if(pAdmInfo->retries < OO_MAX_ARQ_RETRIES)
{
- ret = ooGkClientSendAdmissionRequest(pGkClient, pAdmInfo->call, TRUE);
+ ret = ooGkClientSendAdmissionRequest(pGkClient, pAdmInfo->call, TRUE);
if(ret != OO_OK)
{
OOTRACEERR1("Error:Failed to send ARQ message\n");
* TODO: This fuction might not work properly in case of additive registrations
* For example we registrered 10 aliases and gatekeeper accepted 8 of them.
* Now we want to register another two new aliases(not out of those first 10).
- * Gk responds with RCF with empty terminalAlias field thus indicating both
+ * Gk responds with RCF with empty terminalAlias field thus indicating both
* the aliases were accepted. If this function is called, it will even mark
* the earlier two unregistered aliases as registered. We will have to
* maintain a separete list of aliases being sent in RRQ for this.
*/
int ooGkClientUpdateRegisteredAliases
- (ooGkClient *pGkClient, H225_SeqOfH225AliasAddress *pAddresses,
+ (ooGkClient *pGkClient, H225_SeqOfH225AliasAddress *pAddresses,
OOBOOL registered)
{
int i=0, j, k;
{
/* All aliases registered/unregistsred */
pAlias = gH323ep.aliases;
-
+
while(pAlias)
{
pAlias->registered = registered?TRUE:FALSE;
continue;
}
pAliasAddress = (H225AliasAddress*)pNode->data;
-
+
if(!pAliasAddress){
OOTRACEERR1("Error:Invalid alias list passed to "
"ooGkClientUpdateRegisteredAliases\n");
switch(pAliasAddress->t)
{
case T_H225AliasAddress_dialedDigits:
- pAlias = ooH323GetAliasFromList(gH323ep.aliases,
- T_H225AliasAddress_dialedDigits,
+ pAlias = ooH323GetAliasFromList(gH323ep.aliases,
+ T_H225AliasAddress_dialedDigits,
(char*)pAliasAddress->u.dialedDigits);
if(pAlias)
{
}
}
value[k] = '\0';
- pAlias = ooH323GetAliasFromList(gH323ep.aliases,
- T_H225AliasAddress_h323_ID,
+ pAlias = ooH323GetAliasFromList(gH323ep.aliases,
+ T_H225AliasAddress_h323_ID,
value);
if(pAlias)
{
}
break;
case T_H225AliasAddress_url_ID:
- pAlias = ooH323GetAliasFromList(gH323ep.aliases,
- T_H225AliasAddress_url_ID,
+ pAlias = ooH323GetAliasFromList(gH323ep.aliases,
+ T_H225AliasAddress_url_ID,
(char*)pAliasAddress->u.url_ID);
if(pAlias)
{
OOTRACEERR1("Error:Alias transportID not IP address\n");
break;
}
-
- sprintf(value, "%d.%d.%d.%d:%d",
+
+ sprintf(value, "%d.%d.%d.%d:%d",
pTransportAddrss->u.ipAddress->ip.data[0],
pTransportAddrss->u.ipAddress->ip.data[1],
pTransportAddrss->u.ipAddress->ip.data[2],
pTransportAddrss->u.ipAddress->ip.data[3],
pTransportAddrss->u.ipAddress->port);
- pAlias = ooH323GetAliasFromList(gH323ep.aliases,
- T_H225AliasAddress_transportID,
+ pAlias = ooH323GetAliasFromList(gH323ep.aliases,
+ T_H225AliasAddress_transportID,
value);
if(pAlias)
{
}
break;
case T_H225AliasAddress_email_ID:
- pAlias = ooH323GetAliasFromList(gH323ep.aliases,
- T_H225AliasAddress_email_ID,
+ pAlias = ooH323GetAliasFromList(gH323ep.aliases,
+ T_H225AliasAddress_email_ID,
(char*) pAliasAddress->u.email_ID);
if(pAlias)
{
}
if(bAdd)
{
- pAlias = ooH323AddAliasToList(&gH323ep.aliases,
+ pAlias = ooH323AddAliasToList(&gH323ep.aliases,
&gH323ep.ctxt, pAliasAddress);
if(pAlias){
pAlias->registered = registered?TRUE:FALSE;
* Copyright (C) 2005 by Page Iberica, S.A.
* Copyright (C) 2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooGkClient.h
- * This file contains functions to support RAS protocol.
+ * @file ooGkClient.h
+ * This file contains functions to support RAS protocol.
*
*
*/
#define OO_ARQ_TIMER (1<<3)
#define OO_DRQ_TIMER (1<<4)
-/**
+/**
* @defgroup gkclient Gatekeeper client
* @{
*/
GkClientFailed,
GkClientStopped
};
-
+
typedef struct RasGatekeeperInfo
{
/**
* NOTE- This functionality is not yet fully completed.
- * This is a callback function which is triggered when registration confirm
+ * This is a callback function which is triggered when registration confirm
* message is received from the gatekeeper. The first parameter is the message
- * received. The second parameter provides updated list of aliases after the
+ * received. The second parameter provides updated list of aliases after the
* message was processed by the stack.
* @param rcf Handle to the received registration confirm message
*/
/**
* NOTE- This functionality is not yet fully completed.
- * This is a callback function which is triggered when unregistration confirm
+ * This is a callback function which is triggered when unregistration confirm
* message is received. The first parameter is the message received. The second
- * parameter provides updated list of aliases after the message was processed
+ * parameter provides updated list of aliases after the message was processed
* by the stack.
*/
typedef int (*cb_OnReceivedUnregistrationConfirm)
/**
* NOTE- This functionality is not yet fully completed.
- * This is a callback function which is triggered when unregistration request
+ * This is a callback function which is triggered when unregistration request
* message is received. The first parameter is the message received. The second
* parameter provides the list of aliases requested to be unregistered.
*/
* @param iGkPort Gk port.
*
* @return OO_OK, on success. OO_FAILED, on failure.
- *
+ *
*/
EXTERN int ooGkClientInit
(enum RasGatekeeperMode eGkMode, char *szGkAddr, int iGkPort );
/**
- * This function is used to print the gatekeeper client configuration
+ * This function is used to print the gatekeeper client configuration
* information to log.
* @param pGkClient Handle to gatekeeper client.
*/
EXTERN void ooGkClientPrintConfig(ooGkClient *pGkClient);
/**
- * This function is used to destroy Gatekeeper client. It releases all the
+ * This function is used to destroy Gatekeeper client. It releases all the
* associated memory.
*
* @return OO_OK, on success. OO_FAILED, on failure.
/**
* This function is used to start the Gatekeeper client functionality.
* @param pGkClient Pointer to the Gatekeeper Client.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooGkClientStart(ooGkClient *pGkClient);
/**
- * This function is invoked to set a gatekeeper mode.
- * @param pGkClient Handle to gatekeeper client.
- * @param eGkMode Gatekeeper mode selected. One of the following:
- * - RasNoGatekeeper (DEFAULT), No Gatekeeper.
- * - RasDiscoverGatekeeper, to discover a gatekeeper
+ * This function is invoked to set a gatekeeper mode.
+ * @param pGkClient Handle to gatekeeper client.
+ * @param eGkMode Gatekeeper mode selected. One of the following:
+ * - RasNoGatekeeper (DEFAULT), No Gatekeeper.
+ * - RasDiscoverGatekeeper, to discover a gatekeeper
* automatically.
* - RasUseSpecificGatekeeper, to use a specific gatekeeper.
* @param szGkAddr Gatekeeper address (only when using specific gatekeeper).
*
* @return Completion status - OO_OK on success, OO_FAILED on failure
*/
-EXTERN int ooGkClientSetGkMode(ooGkClient *pGkClient,
- enum RasGatekeeperMode eGkMode, char *szGkAddr,
+EXTERN int ooGkClientSetGkMode(ooGkClient *pGkClient,
+ enum RasGatekeeperMode eGkMode, char *szGkAddr,
int iGkPort );
/**
* identifier.
* @param pGkClient Pointer to gatekeeper client.
* @param psVendor Pointer to vendor identifier to be filled.
- *
+ *
*/
EXTERN void ooGkClientRasFillVendor
(ooGkClient *pGkClient, H225VendorIdentifier *psVendor);
* @param pGkClient Handle to Gatekeeper client for which message has to be
* received.
*
- * @return Completion status - OO_OK on success, OO_FAILED on
+ * @return Completion status - OO_OK on success, OO_FAILED on
* failure
*/
EXTERN int ooGkClientReceive(ooGkClient *pGkClient);
/**
- * This function is used to handle a received RAS message by a gatekeeper
+ * This function is used to handle a received RAS message by a gatekeeper
* client.
* @param pGkClient Handle to gatekeeper client.
* @param pRasMsg Handle to received Ras message.
* @param pGkClient Handle to the gatekeeper client.
* @param pRasMsg Handle to Ras message to be sent.
*
- * @return OO_OK, on success. OO_FAILED, otherwise.
+ * @return OO_OK, on success. OO_FAILED, otherwise.
*/
EXTERN int ooGkClientSendMsg(ooGkClient *pGkClient, H225RasMessage *pRasMsg);
/**
* This function is used to send Gatekeeper request message.
- * @param pGkClient Handle to gatekeeper client for which GRQ message has to
+ * @param pGkClient Handle to gatekeeper client for which GRQ message has to
* be sent.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
/**
* This function is used to send Registration request message.
- * @param pGkClient Handle to gatekeeper client for which RRQ message has to
+ * @param pGkClient Handle to gatekeeper client for which RRQ message has to
* be sent.
- * @param keepAlive Indicates whether keepalive lightweight registration has
+ * @param keepAlive Indicates whether keepalive lightweight registration has
* to be sent.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
/**
* This function is used to send UnRegistration request message.
- * @param pGkClient Handle to gatekeeper client for which URQ message has to
+ * @param pGkClient Handle to gatekeeper client for which URQ message has to
* be sent.
- * @param aliases List of aliases to be unregistered. NULL, if all the
+ * @param aliases List of aliases to be unregistered. NULL, if all the
* aliases have to be unregistered.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
/**
- * This function is used to send an unregistration confirm message to
+ * This function is used to send an unregistration confirm message to
* gatekeeper.
* @param pGkClient Handle to gatekeeper client.
* @param reqNo Request Sequence number for the confirm message.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooGkClientSendUnregistrationConfirm(ooGkClient *pGkClient,
+EXTERN int ooGkClientSendUnregistrationConfirm(ooGkClient *pGkClient,
unsigned reqNo);
/**
- * This function is invoked to request bandwith admission for a call.
+ * This function is invoked to request bandwith admission for a call.
* @param pGkClient Gatekeeper client to be used
* @param call Handle to the call.
- * @param retransmit Indicates whether new call or retransmitting for
+ * @param retransmit Indicates whether new call or retransmitting for
* existing call.
*
* @return OO_OK, on success. OO_FAILED, on failure.
/**
- * This function is used to handle a received Admission Reject message. It
- * finds the associated call and marks it for cleaning with appropriate
+ * This function is used to handle a received Admission Reject message. It
+ * finds the associated call and marks it for cleaning with appropriate
* call end reason code.
* @param pGkClient Handle to Gatekeeper client.
* @param pAdmissionReject Handle to received admission reject message.
(ooGkClient *pGkClient, H225AdmissionReject *pAdmissionReject);
/**
- * This function is invoked to request call disengage to gatekeeper.
+ * This function is invoked to request call disengage to gatekeeper.
* @param pGkClient Gatekeeper client to be used.
* @param call Call Handle
*
EXTERN int ooGkClientCleanCall(ooGkClient *pGkClient, struct OOH323CallData *call);
/**
- * This function is used to handle gatekeeper client failure or gatekeeper
+ * This function is used to handle gatekeeper client failure or gatekeeper
* failure which can be detected by unresponsiveness of gk.
* @param pGkClient Handle to gatekeeper client.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooGkClientUpdateRegisteredAliases
- (ooGkClient *pGkClient, H225_SeqOfH225AliasAddress *pAddresses,
+ (ooGkClient *pGkClient, H225_SeqOfH225AliasAddress *pAddresses,
OOBOOL registered);
/**
*/
int ooGkClientSetCallbacks
(ooGkClient *pGkClient, OOGKCLIENTCALLBACKS callbacks);
-/**
- * @}
+/**
+ * @}
*/
int ooGkClientReInit(ooGkClient *pGkClient);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/** Global endpoint structure */
extern OOH323EndPoint gH323ep;
-OOLogicalChannel* ooAddNewLogicalChannel(OOH323CallData *call, int channelNo,
- int sessionID, char *dir,
+OOLogicalChannel* ooAddNewLogicalChannel(OOH323CallData *call, int channelNo,
+ int sessionID, char *dir,
ooH323EpCapability *epCap)
{
OOLogicalChannel *pNewChannel=NULL, *pChannel=NULL;
OOTRACEDBGC5("Adding new media channel for cap %d dir %s (%s, %s)\n",
epCap->cap, dir, call->callType, call->callToken);
/* Create a new logical channel entry */
- pNewChannel = (OOLogicalChannel*)memAlloc(call->pctxt,
+ pNewChannel = (OOLogicalChannel*)memAlloc(call->pctxt,
sizeof(OOLogicalChannel));
if(!pNewChannel)
{
"(%s, %s)\n", call->callType, call->callToken);
return NULL;
}
-
+
memset(pNewChannel, 0, sizeof(OOLogicalChannel));
pNewChannel->channelNo = channelNo;
pNewChannel->sessionID = sessionID;
pNewChannel->chanCap = epCap;
OOTRACEDBGC4("Adding new channel with cap %d (%s, %s)\n", epCap->cap,
- call->callType, call->callToken);
- /* As per standards, media control port should be same for all
+ call->callType, call->callToken);
+ /* As per standards, media control port should be same for all
proposed channels with same session ID. However, most applications
use same media port for transmit and receive of audio streams. Infact,
- testing of OpenH323 based asterisk assumed that same ports are used.
- Hence we first search for existing media ports for same session and use
+ testing of OpenH323 based asterisk assumed that same ports are used.
+ Hence we first search for existing media ports for same session and use
them. This should take care of all cases.
*/
if(call->mediaInfo)
pMediaInfo = pMediaInfo->next;
}
}
-
+
if(pMediaInfo)
{
OOTRACEDBGC3("Using configured media info (%s, %s)\n", call->callType,
pNewChannel->localRtpPort = pMediaInfo->lMediaRedirPort ? pMediaInfo->lMediaRedirPort : pMediaInfo->lMediaPort;
/* check MediaRedirPort here because RedirCPort is ReditPort + 1 and can't be 0 ;) */
pNewChannel->localRtcpPort = pMediaInfo->lMediaRedirPort ? pMediaInfo->lMediaRedirCPort : pMediaInfo->lMediaCntrlPort;
- /* If user application has not specified a specific ip and is using
+ /* If user application has not specified a specific ip and is using
multihomed mode, substitute appropriate ip.
*/
if(!strcmp(pMediaInfo->lMediaIP, "0.0.0.0") || !strcmp(pMediaInfo->lMediaIP, "::"))
pNewChannel->localRtcpPort = ooGetNextPort (OORTP);
strcpy(pNewChannel->localIP, call->localIP);
}
-
+
/* Add new channel to the list */
pNewChannel->next = NULL;
if(!call->logicalChans) {
while(pChannel->next) pChannel = pChannel->next;
pChannel->next = pNewChannel;
}
-
+
/* increment logical channels */
call->noOfLogicalChannels++;
OOTRACEINFO3("Created new logical channel entry (%s, %s)\n", call->callType,
return pLogicalChannel;
}
-OOLogicalChannel * ooFindLogicalChannelByOLC(OOH323CallData *call,
+OOLogicalChannel * ooFindLogicalChannelByOLC(OOH323CallData *call,
H245OpenLogicalChannel *olc)
{
H245DataType * psDataType=NULL;
H245H2250LogicalChannelParameters * pslcp=NULL;
- OOTRACEDBGC4("ooFindLogicalChannel by olc %d (%s, %s)\n",
+ OOTRACEDBGC4("ooFindLogicalChannel by olc %d (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
if(olc->m.reverseLogicalChannelParametersPresent)
{
- OOTRACEDBGC3("Finding receive channel (%s,%s)\n", call->callType,
+ OOTRACEDBGC3("Finding receive channel (%s,%s)\n", call->callType,
call->callToken);
psDataType = &olc->reverseLogicalChannelParameters.dataType;
/* Only H2250LogicalChannelParameters are supported */
if(olc->reverseLogicalChannelParameters.multiplexParameters.t !=
T_H245OpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters){
- OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
+ OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
return NULL;
}
return ooFindLogicalChannel(call, pslcp->sessionID, "receive", psDataType);
}
else{
- OOTRACEDBGC3("Finding transmit channel (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Finding transmit channel (%s, %s)\n", call->callType,
call->callToken);
psDataType = &olc->forwardLogicalChannelParameters.dataType;
/* Only H2250LogicalChannelParameters are supported */
- if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
+ if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
- OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
+ OOTRACEERR4("Error:Invalid olc %d received (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType, call->callToken);
return NULL;
}
}
}
-OOLogicalChannel * ooFindLogicalChannel(OOH323CallData *call, int sessionID,
+OOLogicalChannel * ooFindLogicalChannel(OOH323CallData *call, int sessionID,
char *dir, H245DataType * dataType)
{
OOLogicalChannel * pChannel = NULL;
while(pChannel)
{
OOTRACEINFO6("Listing logical channel %d cap %d state %d for (%s, %s)\n",
- pChannel->channelNo, pChannel->chanCap->cap, pChannel->state,
+ pChannel->channelNo, pChannel->chanCap->cap, pChannel->state,
call->callType, call->callToken);
if(!strcmp(pChannel->dir, "transmit") && pChannel->state != OO_LOGICALCHAN_IDLE &&
pChannel->state != OO_LOGICALCHAN_PROPOSEDFS)
OOTRACEINFO3("Clearing all logical channels (%s, %s)\n", call->callType,
call->callToken);
-
+
temp = call->logicalChans;
while(temp)
{
prev = temp;
temp = temp->next;
- ooClearLogicalChannel(call, prev->channelNo);/* TODO: efficiency - This causes re-search
- of of logical channel in the list. Can be
+ ooClearLogicalChannel(call, prev->channelNo);/* TODO: efficiency - This causes re-search
+ of logical channel in the list. Can be
easily improved.*/
}
call->logicalChans = NULL;
if(epCap->stopReceiveChannel)
{
epCap->stopReceiveChannel(call, pLogicalChannel);
- OOTRACEINFO4("Stopped Receive channel %d (%s, %s)\n",
+ OOTRACEINFO4("Stopped Receive channel %d (%s, %s)\n",
channelNo, call->callType, call->callToken);
}
else{
if(epCap->stopTransmitChannel)
{
epCap->stopTransmitChannel(call, pLogicalChannel);
- OOTRACEINFO4("Stopped Transmit channel %d (%s, %s)\n",
+ OOTRACEINFO4("Stopped Transmit channel %d (%s, %s)\n",
channelNo, call->callType, call->callToken);
}
else{
OOTRACEERR4("ERROR:No callback registered for stopTransmitChannel"
- " %d (%s, %s)\n", channelNo, call->callType,
+ " %d (%s, %s)\n", channelNo, call->callType,
call->callToken);
}
}
int ooRemoveLogicalChannel(OOH323CallData *call, int ChannelNo)
{
- OOLogicalChannel * temp = NULL, *prev=NULL;
+ OOLogicalChannel * temp = NULL, *prev=NULL;
if(!call->logicalChans)
{
OOTRACEERR4("ERROR:Remove Logical Channel - Channel %d not found "
- "Empty channel List(%s, %s)\n", ChannelNo, call->callType,
+ "Empty channel List(%s, %s)\n", ChannelNo, call->callType,
call->callToken);
return OO_FAILED;
}
prev = temp;
temp = temp->next;
}
-
+
OOTRACEERR4("ERROR:Remove Logical Channel - Channel %d not found "
"(%s, %s)\n", ChannelNo, call->callType, call->callToken);
return OO_FAILED;
}
-/*
-Change the state of the channel as established and close all other
-channels with same session IDs. This is useful for handling fastStart,
+/*
+Change the state of the channel as established and close all other
+channels with same session IDs. This is useful for handling fastStart,
as the endpoint can open multiple logical channels for same sessionID.
-Once the remote endpoint confirms it's selection, all other channels for
+Once the remote endpoint confirms it's selection, all other channels for
the same sessionID must be closed.
*/
int ooOnLogicalChannelEstablished
(OOH323CallData *call, OOLogicalChannel * pChannel)
{
- OOLogicalChannel * temp = NULL, *prev=NULL;
+ OOLogicalChannel * temp = NULL, *prev=NULL;
OOTRACEDBGC3("In ooOnLogicalChannelEstablished (%s, %s)\n",
call->callType, call->callToken);
pChannel->state = OO_LOGICALCHAN_ESTABLISHED;
}
return OO_OK;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooLogChan.h
+ * @file ooLogChan.h
* This file contains structures and functions for maintaining information
* on logical channels within the stack.
*/
struct ooH323EpCapability;
struct OOH323CallData;
-/**
+/**
* Logical channel states.
*/
typedef enum {
- OO_LOGICAL_CHAN_UNKNOWN,
- OO_LOGICALCHAN_IDLE,
- OO_LOGICALCHAN_PROPOSED,
+ OO_LOGICAL_CHAN_UNKNOWN,
+ OO_LOGICALCHAN_IDLE,
+ OO_LOGICALCHAN_PROPOSED,
OO_LOGICALCHAN_ESTABLISHED,
OO_LOGICALCHAN_PROPOSEDFS,
OO_LOGICALCHAN_CLOSEPENDING
int localRtpPort;
int localRtcpPort;
char localIP[2+8*4+7];
- OOLogicalChannelState state;
+ OOLogicalChannelState state;
struct ooH323EpCapability *chanCap;
struct OOLogicalChannel *next;
} OOLogicalChannel;
/**
* This function is used to add a new logical channel entry into the list
* of currently active logical channels.
- * @param call Pointer to the call for which new logical channel
+ * @param call Pointer to the call for which new logical channel
* entry has to be created.
* @param channelNo Channel number for the new channel entry.
* @param sessionID Session identifier for the new channel.
* @return Pointer to logical channel, on success. NULL, on failure
*/
EXTERN ooLogicalChannel* ooAddNewLogicalChannel
- (struct OOH323CallData *call, int channelNo, int sessionID,
+ (struct OOH323CallData *call, int channelNo, int sessionID,
char *dir, ooH323EpCapability *epCap);
/**
- * This function is used to find a logical channel using the logical
+ * This function is used to find a logical channel using the logical
* channel number as a key.
- * @param call Pointer to the call for which logical channel is
+ * @param call Pointer to the call for which logical channel is
* required.
* @param channelNo Forward Logical Channel number for the logical channel
*
- * @return Pointer to the logical channel if found, NULL
- * otherwise.
+ * @return Pointer to the logical channel if found, NULL
+ * otherwise.
*/
EXTERN ooLogicalChannel* ooFindLogicalChannelByLogicalChannelNo
(struct OOH323CallData *call, int channelNo);
/**
- * This function is called when a new logical channel is established. It is
- * particularly useful in case of faststart. When the remote endpoint selects
- * one of the proposed alternatives, other channels for the same session type
+ * This function is called when a new logical channel is established. It is
+ * particularly useful in case of faststart. When the remote endpoint selects
+ * one of the proposed alternatives, other channels for the same session type
* need to be closed. This function is used for that.
*
* @param call Handle to the call which owns the logical channel.
(struct OOH323CallData *call, OOLogicalChannel * pChannel);
/**
- * This function is used to retrieve a logical channel with a particular
- * sessionID. Note that there can be two entries of logical channel, one in
- * each direction. This function will return the first channel which has the
+ * This function is used to retrieve a logical channel with a particular
+ * sessionID. Note that there can be two entries of logical channel, one in
+ * each direction. This function will return the first channel which has the
* same session ID.
* @param call Handle to the call which owns the channels to be searched.
* @param sessionID Session id of the session which is to be searched for.
* @param dir Direction of the channel.(transmit/receive)
*
- * @return Returns a pointer to the logical channel if found, NULL
+ * @return Returns a pointer to the logical channel if found, NULL
* otherwise.
*/
EXTERN ooLogicalChannel* ooGetLogicalChannel
(struct OOH323CallData *call, int sessionID, char *dir);
/**
- * This function is used to remove a logical channel from the list of
+ * This function is used to remove a logical channel from the list of
* channels within the call structure.
- * @param call Pointer to the call from which logical channel has
+ * @param call Pointer to the call from which logical channel has
* to be removed.
* @param ChannelNo Forward logical channel number of the channel to be
* removed.
/**
* This function is used to cleanup a logical channel. It first stops media if
- * it is still active and then removes the channel from the list, freeing up
+ * it is still active and then removes the channel from the list, freeing up
* all the associated memory.
* @param call Handle to the call which owns the logical channel.
* @param channelNo Channel number identifying the channel.
EXTERN int ooClearLogicalChannel (struct OOH323CallData *call, int channelNo);
/**
- * This function is used to cleanup all the logical channels associated with
+ * This function is used to cleanup all the logical channels associated with
* the call.
* @param call Handle to the call which owns the channels.
*
EXTERN OOLogicalChannel* ooGetTransmitLogicalChannel(struct OOH323CallData *call);
EXTERN OOLogicalChannel* ooGetReceiveLogicalChannel(struct OOH323CallData *call);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
WSADATA wsaData;
int err;
- if (inited) return ASN_OK;
+ if (inited) return ASN_OK;
wVersionRequested = MAKEWORD( 1, 1 );
-
+
err = WSAStartup (wVersionRequested, &wsaData);
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
// ws32 = LoadLibrary ("WSOCK32.DLL");
ws32 = LoadLibrary ("WS2_32.DLL");
if (ws32 == NULL) return ASN_E_NOTINIT;
-
+
wsaStartup = (LPFN_WSASTARTUP) GetProcAddress (ws32, "WSAStartup");
if (wsaStartup == NULL) return ASN_E_NOTINIT;
-
+
send = (LPFN_SEND) GetProcAddress (ws32, "send");
if (send == NULL) return ASN_E_NOTINIT;
-
+
socket = (LPFN_SOCKET) GetProcAddress (ws32, "socket");
if (socket == NULL) return ASN_E_NOTINIT;
-
+
setsockopt = (LPFN_SETSOCKOPT) GetProcAddress (ws32, "setsockopt");
if (setsockopt == NULL) return ASN_E_NOTINIT;
-
+
bind = (LPFN_BIND) GetProcAddress (ws32, "bind");
if (bind == NULL) return ASN_E_NOTINIT;
-
+
htonl = (LPFN_HTONL) GetProcAddress (ws32, "htonl");
if (htonl == NULL) return ASN_E_NOTINIT;
-
+
htons = (LPFN_HTONS) GetProcAddress (ws32, "htons");
if (htons == NULL) return ASN_E_NOTINIT;
-
+
connect = (LPFN_CONNECT) GetProcAddress (ws32, "connect");
if (connect == NULL) return ASN_E_NOTINIT;
-
+
listen = (LPFN_LISTEN) GetProcAddress (ws32, "listen");
if (listen == NULL) return ASN_E_NOTINIT;
-
+
accept = (LPFN_ACCEPT) GetProcAddress (ws32, "accept");
if (accept == NULL) return ASN_E_NOTINIT;
-
+
inet_addr = (LPFN_INET_ADDR) GetProcAddress (ws32, "inet_addr");
if (inet_addr == NULL) return ASN_E_NOTINIT;
-
+
ntohl = (LPFN_NTOHL) GetProcAddress (ws32, "ntohl");
if (ntohl == NULL) return ASN_E_NOTINIT;
-
+
ntohs = (LPFN_NTOHS) GetProcAddress (ws32, "ntohs");
if (ntohs == NULL) return ASN_E_NOTINIT;
-
+
recv = (LPFN_RECV) GetProcAddress (ws32, "recv");
if (recv == NULL) return ASN_E_NOTINIT;
-
+
shutdown = (LPFN_SHUTDOWN) GetProcAddress (ws32, "shutdown");
if (shutdown == NULL) return ASN_E_NOTINIT;
-
+
closesocket = (LPFN_CLOSESOCKET) GetProcAddress (ws32, "closesocket");
if (closesocket == NULL) return ASN_E_NOTINIT;
getsockname = (LPFN_GETSOCKNAME) GetProcAddress (ws32, "getsockname");
if (getsockname == NULL) return ASN_E_NOTINIT;
-
+
ioctlsocket = (LPFN_IOCTLSOCKET) GetProcAddress(ws32, "ioctlsocket");
if(ioctlsocket == NULL) return ASN_E_NOTINIT;
gethostbyname = (LPFN_GETHOSTBYNAME) GetProcAddress (ws32, "gethostbyname");
if (gethostbyname == NULL) return ASN_E_NOTINIT;
-
- WSAGetLastError = (LPFN_WSAGETLASTERROR) GetProcAddress (ws32,
+
+ WSAGetLastError = (LPFN_WSAGETLASTERROR) GetProcAddress (ws32,
"WSAGetLastError");
if (WSAGetLastError == NULL) return ASN_E_NOTINIT;
WSACleanup = (LPFN_WSACLEANUP) GetProcAddress (ws32, "WSACleanup");
if (WSACleanup == NULL) return ASN_E_NOTINIT;
-
-
+
+
if (wsaStartup (MAKEWORD(1, 1), &wsaData) == -1) return ASN_E_NOTINIT;
#endif
return ASN_OK;
typedef socklen_t OOSOCKLEN;
#endif
-int ooSocketCreate (OOSOCKET* psocket, int family)
+int ooSocketCreate (OOSOCKET* psocket, int family)
{
int on;
OOSOCKET sock;
SOCK_STREAM,
0);
}
-
+
if (sock == OOSOCKET_INVALID){
OOTRACEERR1("Error:Failed to create TCP socket\n");
return ASN_E_INVSOCKET;
}
on = 1;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
+ if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
(const char* ) &on, sizeof (on)) == -1)
{
OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n");
}
linger.l_onoff = 1;
linger.l_linger = 0;
- if (setsockopt (sock, SOL_SOCKET, SO_LINGER,
+ if (setsockopt (sock, SOL_SOCKET, SO_LINGER,
(const char* ) &linger, sizeof (linger)) == -1)
{
OOTRACEERR1("Error:Failed to set socket option linger\n");
return ASN_OK;
}
-int ooSocketCreateUDP (OOSOCKET* psocket, int family)
+int ooSocketCreateUDP (OOSOCKET* psocket, int family)
{
int on;
OOSOCKET sock;
}
on = 1;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
+ if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR,
(const char* ) &on, sizeof (on)) == -1)
{
OOTRACEERR1("Error:Failed to set socket option SO_REUSEADDR\n");
/*
linger.l_onoff = 1;
linger.l_linger = 0;
- if (setsockopt (sock, SOL_SOCKET, SO_LINGER,
+ if (setsockopt (sock, SOL_SOCKET, SO_LINGER,
(const char* ) &linger, sizeof (linger)) == -1)
return ASN_E_INVSOCKET;
*/
return ASN_OK;
}
-int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port)
+int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port)
{
struct ast_sockaddr m_addr;
if (socket == OOSOCKET_INVALID)
- {
+ {
OOTRACEERR1("Error:Invalid socket passed to bind\n");
return ASN_E_INVSOCKET;
}
host = ast_sockaddr_stringify_addr(&addr);
if(host && strlen(host) < (unsigned)len)
- strcpy(ip, host);
+ strcpy(ip, host);
else{
OOTRACEERR1("Error:Insufficient buffer for ip address - "
"ooSocketGetIpAndPort\n");
return ASN_OK;
}
-int ooSocketListen (OOSOCKET socket, int maxConnection)
+int ooSocketListen (OOSOCKET socket, int maxConnection)
{
if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;
return ASN_OK;
}
-int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,
- char* destAddr, int* destPort)
+int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,
+ char* destAddr, int* destPort)
{
struct ast_sockaddr addr;
char* host = NULL;
return ASN_OK;
}
-int ooSocketConnect (OOSOCKET socket, const char* host, int port)
+int ooSocketConnect (OOSOCKET socket, const char* host, int port)
{
struct ast_sockaddr m_addr;
if (socket == OOSOCKET_INVALID)
- {
+ {
return ASN_E_INVSOCKET;
}
-
+
memset (&m_addr, 0, sizeof (m_addr));
ast_parse_arg(host, PARSE_ADDR, &m_addr);
ast_sockaddr_set_port(&m_addr, port);
}
/*
// **Need to add check whether complete data was sent by checking the return
-// **value of send and if complete data is not sent then add mechanism to
+// **value of send and if complete data is not sent then add mechanism to
// **send remaining bytes. This will make ooSocketSend call atomic.
*/
int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size)
{
if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;
-
+
if (send (socket, (const char*) pdata, size, SEND_FLAGS) == -1)
return ASN_E_INVSOCKET;
return ASN_OK;
{
struct sockaddr_in m_addr;
if (socket == OOSOCKET_INVALID) return ASN_E_INVSOCKET;
-
+
memset (&m_addr, 0, sizeof (m_addr));
m_addr.sin_family = AF_INET;
m_addr.sin_port = htons ((unsigned short)port);
m_addr.sin_addr.s_addr = inet_addr (host);
- if (sendto (socket, (const char*) pdata, size, SEND_FLAGS,
- (const struct sockaddr*)&m_addr,
+ if (sendto (socket, (const char*) pdata, size, SEND_FLAGS,
+ (const struct sockaddr*)&m_addr,
sizeof(m_addr)) == -1)
return ASN_E_INVSOCKET;
return ASN_OK;
addrlen = sizeof(m_addr);
memset (&m_addr, 0, sizeof (m_addr));
-
- if ((len = recvfrom (socket, (char*) pbuf, bufsize, 0,
+
+ if ((len = recvfrom (socket, (char*) pbuf, bufsize, 0,
(struct sockaddr*)&m_addr, (socklen_t *) &addrlen)) == -1)
return ASN_E_INVSOCKET;
return len;
}
-int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,
+int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval * timeout)
{
- int ret;
+ int ret;
#if defined (_WIN32)
- ret = select(nfds, readfds, writefds, exceptfds,
+ ret = select(nfds, readfds, writefds, exceptfds,
(const struct timeval *) timeout);
#else
ret = select(nfds, readfds, writefds, exceptfds, timeout);
int ooPDRead(struct pollfd *pfds, int nfds, int fd)
{
int i;
- for (i=0;i<nfds;i++)
+ for (i=0;i<nfds;i++)
if (pfds[i].fd == fd && (pfds[i].revents & POLLIN))
return 1;
return 0;
if (hp->h_addrtype == AF_INET6) {
struct in6_addr i;
memcpy(&i, hp->h_addr, sizeof(i));
- strcpy(pIPAddrs, (inet_ntop(AF_INET6, &i,
- hostname, sizeof(hostname))) == NULL ? "::1" :
+ strcpy(pIPAddrs, (inet_ntop(AF_INET6, &i,
+ hostname, sizeof(hostname))) == NULL ? "::1" :
inet_ntop(AF_INET6, &i, hostname, sizeof(hostname)));
} else {
struct in_addr i;
return ASN_OK;
}
-/* int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr)
+/* int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr)
{
int b1, b2, b3, b4;
int rv = sscanf (pIPAddrStr, "%d.%d.%d.%d", &b1, &b2, &b3, &b4);
(b1 < 0 || b1 > 256) || (b2 < 0 || b2 > 256) ||
(b3 < 0 || b3 > 256) || (b4 < 0 || b4 > 256))
return ASN_E_INVPARAM;
- *pIPAddr = ((b1 & 0xFF) << 24) | ((b2 & 0xFF) << 16) |
+ *pIPAddr = ((b1 & 0xFF) << 24) | ((b2 & 0xFF) << 16) |
((b3 & 0xFF) << 8) | (b4 & 0xFF);
return ASN_OK;
}
OOTRACEERR1("Error:Failed to convert address\n");
return -1;
}
-
+
#endif
-
+
memcpy(netIp, (char*)&sin.sin_addr.s_addr, sizeof(unsigned long));
return ASN_OK;
}
char buf1[5], buf2[5], buf3[5], buf4[5];
int cnt = 0;
- if (bufsize < 8)
+ if (bufsize < 8)
return ASN_E_BUFOVFLW;
cnt += sprintf (buf1, "%lu", (ipAddr >> 24) & 0xFF);
if(ooSocketCreateUDP(&sock, 4)!= ASN_OK)
{
OOTRACEERR1("Error:Failed to create udp socket - "
- "ooSocketGetInterfaceList\n");
+ "ooSocketGetInterfaceList\n");
return -1;
}
#ifdef SIOCGIFNUM
#else
ifNum = 50;
#endif
-
+
ifc.ifc_len = ifNum * sizeof(struct ifreq);
ifc.ifc_req = (struct ifreq *)memAlloc(pctxt, ifNum *sizeof(struct ifreq));
if(!ifc.ifc_req)
#ifdef ifr_netmask
char mask[50];
#endif
-
+
pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface));
pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1);
if(!pIf)
return -1;
}
OOTRACEDBGA2("\tInterface name: %s\n", ifName->ifr_name);
-
-
+
+
strcpy(ifReq.ifr_name, ifName->ifr_name);
strcpy(pName, ifName->ifr_name);
pIf->name = pName;
/* Check whether the interface is up*/
if (ioctl(sock, SIOCGIFFLAGS, &ifReq) < 0) {
- OOTRACEERR2("Error:Unable to determine status of interface %s\n",
+ OOTRACEERR2("Error:Unable to determine status of interface %s\n",
pName);
memFreePtr(pctxt, pIf->name);
memFreePtr(pctxt, pIf);
}
/* Retrieve interface address */
- if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0)
+ if (ioctl(sock, SIOCGIFADDR, &ifReq) < 0)
{
- OOTRACEWARN2("Warn:Unable to determine address of interface %s\n",
+ OOTRACEWARN2("Warn:Unable to determine address of interface %s\n",
pName);
memFreePtr(pctxt, pIf->name);
memFreePtr(pctxt, pIf);
return -1;
}
strcpy(pIf->addr, addr);
-
+
#ifdef ifr_netmask
- if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0)
+ if (ioctl(sock, SIOCGIFNETMASK, &ifReq) < 0)
{
- OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n",
+ OOTRACEWARN2("Warn:Unable to determine mask for interface %s\n",
pName);
memFreePtr(pctxt, pIf->name);
memFreePtr(pctxt, pIf->addr);
*/
}
- }
+ }
return ASN_OK;
}
#endif
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file ooSocket.h
+/**
+ * @file ooSocket.h
* Common runtime constants, data structure definitions, and run-time functions
* to support the sockets' operations.
*/
#endif /* MAKE_DLL */
#endif /* EXTERN */
-/**
+/**
* @defgroup sockets Socket Layer
* @{
*/
#define OOSOCKET_INVALID ((OOSOCKET)-1)
-/**
+/**
* The IP address represented as unsigned long value. The most significant 8
* bits in this unsigned long value represent the first number of the IP
* address. The least significant 8 bits represent the last number of the IP
* @return Completion status of operation: 0 (ASN_OK) = success,
* negative return value is error.
*/
-EXTERN int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,
+EXTERN int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket,
char* destAddr, int* destPort);
/**
EXTERN int ooSocketCreate (OOSOCKET* psocket, int family);
/**
- * This function creates a UDP datagram socket.
+ * This function creates a UDP datagram socket.
*
* @param psocket The pointer to the socket's handle variable to receive
* the handle of new socket.
EXTERN int ooSocketsInit (void);
/**
- * This function terminates use of sockets by an application. This function
+ * This function terminates use of sockets by an application. This function
* must be called after done with sockets.
*
* @return Completion status of operation: 0 (ASN_OK) = success,
* @return If no error occurs, returns the number of bytes
* received. Otherwise, the negative value is error code.
*/
-EXTERN int ooSocketRecv (OOSOCKET socket, ASN1OCTET* pbuf,
+EXTERN int ooSocketRecv (OOSOCKET socket, ASN1OCTET* pbuf,
ASN1UINT bufsize);
/**
* This function receives data from a connected/unconnected socket. It is used
- * to read incoming data on sockets. It populates the remotehost and
- * remoteport parameters with information of remote host. See description of
+ * to read incoming data on sockets. It populates the remotehost and
+ * remoteport parameters with information of remote host. See description of
* 'recvfrom' socket function for further details.
*
* @param socket The socket's handle created by call to ooSocketCreate
- *
+ *
* @param pbuf Pointer to the buffer for the incoming data.
* @param bufsize Length of the buffer.
* @param remotehost Pointer to a buffer in which remote ip address
* received. Otherwise, negative value.
*/
EXTERN int ooSocketRecvFrom (OOSOCKET socket, ASN1OCTET* pbuf,
- ASN1UINT bufsize, char * remotehost,
+ ASN1UINT bufsize, char * remotehost,
ASN1UINT hostBufLen, int * remoteport);
/**
* This function sends data on a connected socket. It is used to write outgoing
* @return Completion status of operation: 0 (ASN_OK) = success,
* negative return value is error.
*/
-EXTERN int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata,
+EXTERN int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata,
ASN1UINT size);
/**
- * This function sends data on a connected or unconnected socket. See
+ * This function sends data on a connected or unconnected socket. See
* description of 'sendto' socket function for further details.
*
* @param socket The socket's handle created by call to ::rtSocketCreate
* or ::rtSocketAccept function.
* @param pdata Buffer containing the data to be transmitted.
* @param size Length of the data in pdata.
- * @param remotehost Remote host ip address to which data has to
+ * @param remotehost Remote host ip address to which data has to
* be sent.
- * @param remoteport Remote port ip address to which data has to
+ * @param remoteport Remote port ip address to which data has to
* be sent.
*
* @return Completion status of operation: 0 (ASN_OK) = success,
* negative return value is error.
*/
-EXTERN int ooSocketSendTo(OOSOCKET socket, const ASN1OCTET* pdata,
+EXTERN int ooSocketSendTo(OOSOCKET socket, const ASN1OCTET* pdata,
ASN1UINT size, const char* remotehost,
int remoteport);
/**
* This function is used for synchronous monitoring of multiple sockets.
- * For more information refer to documnetation of "select" system call.
+ * For more information refer to documnetation of "select" system call.
*
- * @param nfds The highest numbered descriptor to be monitored
+ * @param nfds The highest numbered descriptor to be monitored
* plus one.
- * @param readfds The descriptors listed in readfds will be watched for
+ * @param readfds The descriptors listed in readfds will be watched for
* whether read would block on them.
* @param writefds The descriptors listed in writefds will be watched for
* whether write would block on them.
* @param exceptfds The descriptors listed in exceptfds will be watched for
* exceptions.
- * @param timeout Upper bound on amout of time elapsed before select
- * returns.
+ * @param timeout Upper bound on amout of time elapsed before select
+ * returns.
* @return Completion status of operation: 0 (ASN_OK) = success,
* negative return value is error.
*/
-EXTERN int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,
+EXTERN int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval * timeout) attribute_deprecated;
EXTERN int ooSocketPoll(struct pollfd *pfds, int nfds, int timeout);
EXTERN int ooGetLocalIPAddress(char * pIPAddrs);
-EXTERN int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name,
+EXTERN int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name,
socklen_t *size);
/**
* This function is used to retrieve the ip and port number used by the socket
- * passed as parameter. It internally uses getsockname system call for this
+ * passed as parameter. It internally uses getsockname system call for this
* purpose.
* @param socket Socket for which ip and port has to be determined.
* @param ip Buffer in which ip address will be returned.
EXTERN int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
}
#endif
#endif /* _OOSOCKET_H_ */
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
return 0;
}
-OOStkCmdStat ooMakeCall
+OOStkCmdStat ooMakeCall
(const char* dest, char* callToken, size_t bufsiz, ooCallOptions *opts)
{
OOStackCommand cmd;
if(!callToken)
return OO_STKCMD_INVALIDPARAM;
-
+
/* Generate call token*/
if (ooGenerateOutgoingCallToken (callToken, bufsiz) != OO_OK){
}
strcpy((char*)cmd.param1, dest);
-
+
cmd.param2 = (void*) malloc(strlen(callToken)+1);
if(!cmd.param2)
{
free(cmd.param1);
return OO_STKCMD_MEMERR;
}
-
+
strcpy((char*)cmd.param2, callToken);
if(!opts)
return OO_STKCMD_SUCCESS;
}
-OOStkCmdStat ooRunCall
+OOStkCmdStat ooRunCall
(const char* dest, char* callToken, size_t bufsiz, ooCallOptions *opts)
{
OOStackCommand cmd;
if(!callToken)
return OO_STKCMD_INVALIDPARAM;
-
+
memset(&cmd, 0, sizeof(OOStackCommand));
cmd.type = OO_CMD_MAKECALL;
strcpy((char*)cmd.param1, dest);
cmd.plen1 = strlen(dest);
-
+
cmd.param2 = (void*) malloc(strlen(callToken)+1);
if(!cmd.param2)
{
free(cmd.param1);
return OO_STKCMD_MEMERR;
}
-
+
strcpy((char*)cmd.param2, callToken);
cmd.plen2 = strlen(callToken);
}
strcpy((char*)cmd.param1, callToken);
cmd.plen1 = strlen(callToken);
-
+
if(ooWriteCallStackCommand(call,&cmd) != OO_OK)
{
free(cmd.param1);
}
strcpy((char*)cmd.param1, callToken);
cmd.plen1 = strlen(callToken);
-
+
if(ooWriteCallStackCommand(call, &cmd) != OO_OK)
{
free(cmd.param1);
return OO_STKCMD_MEMERR;
}
strcpy((char*)cmd.param1, callToken);
- cmd.plen1 = strlen(callToken);
+ cmd.plen1 = strlen(callToken);
if(ooWriteCallStackCommand(call, &cmd) != OO_OK)
{
free(cmd.param1);
free(cmd.param2);
free(cmd.param3);
-
+
return OO_STKCMD_SUCCESS;
}
memset(&cmd, 0, sizeof(OOStackCommand));
cmd.type = OO_CMD_STOPMONITOR;
-
+
if(ooWriteStackCommand(&cmd) != OO_OK)
return OO_STKCMD_WRITEERR;
cmd.plen1 = strlen(callToken);
strcpy((char*)cmd.param2, dtmf);
cmd.plen2 = strlen(dtmf);
-
+
if(ooWriteCallStackCommand(call,&cmd) != OO_OK)
{
free(cmd.param1);
cmd.plen1 = strlen(callToken);
strcpy((char*)cmd.param2, ani);
cmd.plen2 = strlen(ani);
-
+
if(ooWriteCallStackCommand(call,&cmd) != OO_OK)
{
free(cmd.param1);
cmd.plen1 = strlen(callToken);
*((int *) cmd.param2) = isT38Mode;
cmd.plen2 = sizeof(int);
-
+
if(ooWriteCallStackCommand(call,&cmd) != OO_OK)
{
free(cmd.param1);
case OO_STKCMD_WRITEERR:
return "Stack command - write error";
- case OO_STKCMD_CONNECTIONERR:
+ case OO_STKCMD_CONNECTIONERR:
return "Stack command - Failed to create command channel";
default:
return "Invalid status code";
}
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooStackCmds.h
+ * @file ooStackCmds.h
* This file contains stack commands which an user application can use to make
- * call, hang call etc.
+ * call, hang call etc.
*/
#ifndef OO_STACKCMDS_H
-/**
+/**
* @defgroup stackcmds Stack Control Commands
* @{
*/
OO_CMD_REQMODE, /*!< Request new mode */
OO_CMD_SETANI, /*! <Set conncted info */
OO_CMD_UPDLC /*! <Update Logical channels */
-
+
} OOStackCmdID;
/**
- * This structure is used to queue a stack command for processing in
+ * This structure is used to queue a stack command for processing in
* the event handler loop.
*/
typedef struct OOStackCommand {
*
* @return Returns OOStkCmdStat value indication success or failure.
*/
-EXTERN OOStkCmdStat ooMakeCall
+EXTERN OOStkCmdStat ooMakeCall
(const char* dest, char *callToken, size_t bufsiz, ooCallOptions *opts);
* This function is used to send a manual ringback message (alerting message)
* for a call. Effective only when manual-ringback is enabled.
* @param callToken Unique token for the call.
- *
+ *
* @return Returns OOStkCmdStat value indication success or failure.
*/
EXTERN OOStkCmdStat ooManualRingback(const char *callToken);
/**
* This function is used to answer a call
* @param callToken Unique token for the call
- *
+ *
* @return Returns OOStkCmdStat value indication success or failure.
*/
EXTERN OOStkCmdStat ooAnswerCall(const char *callToken);
EXTERN OOStkCmdStat ooHangCall(const char* callToken, OOCallClearReason reason, int q931cause);
/**
- * This command function can be used by an user application to send a DTMF
+ * This command function can be used by an user application to send a DTMF
* sequence using H.245 UserInputIndication message.
* @param callToken Unique token for the call
* @param alpha Alphanumeric string reperesenting dtmf sequence
* @return Text description corresponding to the code.
*/
EXTERN const char* ooGetStkCmdStatusCodeTxt(OOStkCmdStat stat);
-/**
- * @}
+/**
+ * @}
*/
EXTERN OOStkCmdStat ooRequestChangeMode(const char *callToken, int isT38Mode);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#endif
/**
- * This is a timer list used by test application chansetup only.
+ * This is a timer list used by test application chansetup only.
*/
DList g_TimerList;
-OOTimer* ooTimerCreate
-(OOCTXT* pctxt, DList *pList, OOTimerCbFunc cb, OOUINT32 deltaSecs, void *data,
+OOTimer* ooTimerCreate
+(OOCTXT* pctxt, DList *pList, OOTimerCbFunc cb, OOUINT32 deltaSecs, void *data,
OOBOOL reRegister)
{
OOTimer* pTimer = (OOTimer*) memAlloc (pctxt, sizeof(OOTimer));
if (ooTimerExpired (pTimer)) {
/*
* Re-register before calling callback function in case it is
- * a long duration callback.
+ * a long duration callback.
*/
if (pTimer->reRegister) ooTimerReset (pctxt, pList, pTimer);
ooGetTimeOfDay (&tvstr, 0);
- ptimeout->tv_sec =
- OOMAX ((int) 0, (int) (ptimer->expireTime.tv_sec - tvstr.tv_sec));
+ ptimeout->tv_sec =
+ OOMAX ((int) 0, (int) (ptimer->expireTime.tv_sec - tvstr.tv_sec));
ptimeout->tv_usec = ptimer->expireTime.tv_usec - tvstr.tv_usec;
return (ptimeout);
}
-/*
+/*
* Reregister a timer entry. This function is responsible for moving
* the current pointer in the timer list to the next element to be
* processed..
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the LICENSE.txt file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the LICENSE.txt file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file ooTimer.h
+/**
+ * @file ooTimer.h
* Timer structures and functions.
*/
#ifndef _OOTIMER_H_
#endif
/**
- * This function computes the relative expiration time from the current
+ * This function computes the relative expiration time from the current
* time for the given timer object.
*
* @param pTimer Pointer to timer object.
* @param reRegister Should timer be re-registered after it expires?
* @return Pointer to created timer object.
*/
-EXTERN OOTimer* ooTimerCreate
+EXTERN OOTimer* ooTimerCreate
(OOCTXT* pctxt, DList *pList, OOTimerCbFunc cb, OOUINT32 deltaSecs, void *data,
OOBOOL reRegister);
EXTERN OOBOOL ooTimerExpired (OOTimer* pTimer);
/**
- * This function loops through the global timer list and fires all
+ * This function loops through the global timer list and fires all
* expired timers by calling the registered callback functions.
*/
EXTERN void ooTimerFireExpired (OOCTXT* pctxt, DList* pList);
/**
- * This function inserts the given timer object into the correct
+ * This function inserts the given timer object into the correct
* chronological position in the global timer list.
* @param pctxt Pointer to OOCTXT structure used for memory allocation.
* @param pList List in which timer has to be inserted.
EXTERN int ooTimerInsertEntry (OOCTXT* pctxt, DList* pList, OOTimer* pTimer);
/**
- * This function calculates the relative time from the current time
+ * This function calculates the relative time from the current time
* that the first timer in global timer list will expire.
* @param pList Handle to timer list
* @param ptimeout timeval structure to receive timeout value.
EXTERN struct timeval* ooTimerNextTimeout (DList* pList, struct timeval* ptimeout);
/**
- * This function resets the given timer object if its reregister flag
+ * This function resets the given timer object if its reregister flag
* is set. Otherwise, it is deleted.
* @param pctxt Pointer to OOCTXT structre used for memory allocation.
* @param pList Pointer to timer list.
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
}
-OOBOOL ooIsDailedDigit(const char* str)
+OOBOOL ooIsDailedDigit(const char* str)
{
if(str == NULL || *str =='\0') { return FALSE; }
while(*str != '\0')
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooUtils.h
- * This file contains general utility functions.
+ * @file ooUtils.h
+ * This file contains general utility functions.
*/
#ifndef _OOUTILS_H_
#define _OOUTILS_H_
* @param tabsiz Number of items in the table
* @return Text for item or '?' if idx outside bounds of table
*/
-EXTERN const char* ooUtilsGetText
+EXTERN const char* ooUtilsGetText
(OOUINT32 idx, const char** table, size_t tabsiz);
/**
- * Test if given string value is empty. String is considered to empty
+ * Test if given string value is empty. String is considered to empty
* if value is NULL or there are no characters in string (strlen == 0).
*
* @param str String to test
/**
- * Test if given string value is digit string.
+ * Test if given string value is digit string.
*
* @param str String to test
* @return TRUE if string contains all digits; FALSE otherwise
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file ooasn1.h
+/**
+ * @file ooasn1.h
* Common ASN.1 runtime constants, data structure definitions, and run-time
- * functions to support ASN.1 PER encoding/decoding as defined in the
+ * functions to support ASN.1 PER encoding/decoding as defined in the
* ITU-T standards.
*/
#ifndef _OOASN1_H_
#include <stddef.h>
#include "dlist.h"
#include "ootrace.h"
-/**
- * @defgroup cruntime C Runtime Common Functions
+/**
+ * @defgroup cruntime C Runtime Common Functions
* @{
*/
#elif defined(__IBMC__) || defined(__GNUC__) || defined(__SUNPRO_C) || \
defined(__SUNPRO_CC) || defined(__CC_ARM) || \
-defined(__HPUX_CC__) || defined(__HP_aCC)
+defined(__HPUX_CC__) || defined(__HP_aCC)
#define ASN1INT64 long long
#else /* !MSC_VER && !__IBMC__ etc */
#endif
/**
- * @defgroup mem Memory Allocation Macros and Functions
+ * @defgroup mem Memory Allocation Macros and Functions
* @ingroup cruntime
*
* Memory allocation functions and macros handle memory management for the
/* Context management functions */
/**
- * @defgroup cmfun Context Management Functions
+ * @defgroup cmfun Context Management Functions
* @{
*
* Context initialization functions handle the allocation, initialization, and
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int initContextBuffer
+EXTERN int initContextBuffer
(OOCTXT* pctxt, const ASN1OCTET* bufaddr, ASN1UINT bufsiz);
/**
EXTERN void setCtxtFlag (OOCTXT* pctxt, ASN1USINT mask);
EXTERN void clearCtxtFlag (OOCTXT* pctxt, ASN1USINT mask);
-EXTERN int setPERBuffer
+EXTERN int setPERBuffer
(OOCTXT* pctxt, ASN1OCTET* bufaddr, ASN1UINT bufsiz, ASN1BOOL aligned);
EXTERN int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource);
#define ZEROCONTEXT(pctxt) memset(pctxt,0,sizeof(OOCTXT))
-/**
+/**
* @} cmfun
*/
/**
- * @defgroup errfp Error Formatting and Print Functions
+ * @defgroup errfp Error Formatting and Print Functions
* @{
*
* Error formatting and print functions allow information about the
* @param errprm_p The typed error parameter.
* @return The status of the operation.
*/
-EXTERN int errAddStrParm (ASN1ErrInfo* pErrInfo,
+EXTERN int errAddStrParm (ASN1ErrInfo* pErrInfo,
const char* errprm_p);
/**
EXTERN int errAddUIntParm (ASN1ErrInfo* pErrInfo, unsigned int errParm);
-EXTERN int errCopyData (ASN1ErrInfo* pSrcErrInfo,
+EXTERN int errCopyData (ASN1ErrInfo* pSrcErrInfo,
ASN1ErrInfo* pDestErrInfo);
/**
*/
EXTERN int errReset (ASN1ErrInfo* pErrInfo);
-/**
+/**
* This function sets error information in an error information structure. The
* information set includes status code, module name, and line number. Location
* information (i.e. module name and line number) is pushed onto a stack within
* information and return the status value in one line of
* code.
*/
-EXTERN int errSetData (ASN1ErrInfo* pErrInfo, int status,
+EXTERN int errSetData (ASN1ErrInfo* pErrInfo, int status,
const char* module, int lno);
#ifndef _COMPACT
#define LOG_ASN1ERR_AND_FREE(pctxt,stat,lctxt) \
freeContext ((lctxt)), LOG_ASN1ERR(pctxt, stat)
-/**
- * @}
+/**
+ * @}
*/
#define RT_MH_DONTKEEPFREE 0x1
* @{
*/
/**
- * Allocate memory. This macro allocates the given number of bytes. It is
+ * Allocate memory. This macro allocates the given number of bytes. It is
* similar to the C \c malloc run-time function.
- *
+ *
* @param pctxt - Pointer to a context block
* @param nbytes - Number of bytes of memory to allocate
- * @return - Void pointer to allocated memory or NULL if insufficient memory
+ * @return - Void pointer to allocated memory or NULL if insufficient memory
* was available to fulfill the request.
*/
#define memAlloc(pctxt,nbytes) \
/**
* Allocate and zero memory. This macro allocates the given number of bytes
* and then initializes the memory block to zero.
- *
+ *
* @param pctxt - Pointer to a context block
* @param nbytes - Number of bytes of memory to allocate
- * @return - Void pointer to allocated memory or NULL if insufficient memory
+ * @return - Void pointer to allocated memory or NULL if insufficient memory
* was available to fulfill the request.
*/
#define memAllocZ(pctxt,nbytes) \
memHeapAllocZ(&(pctxt)->pTypeMemHeap,nbytes)
/**
- * Reallocate memory. This macro reallocates a memory block (either
- * expands or contracts) to the given number of bytes. It is
+ * Reallocate memory. This macro reallocates a memory block (either
+ * expands or contracts) to the given number of bytes. It is
* similar to the C \c realloc run-time function.
- *
+ *
* @param pctxt - Pointer to a context block
- * @param mem_p - Pointer to memory block to reallocate. This must have been
+ * @param mem_p - Pointer to memory block to reallocate. This must have been
* allocated using the memHeapAlloc macro or the memHeapAlloc function.
- * @param nbytes - Number of bytes of memory to which the block is to be
+ * @param nbytes - Number of bytes of memory to which the block is to be
* resized.
- * @return - Void pointer to allocated memory or NULL if insufficient memory
- * was available to fulfill the request. This may be the same as the pmem
+ * @return - Void pointer to allocated memory or NULL if insufficient memory
+ * was available to fulfill the request. This may be the same as the pmem
* pointer that was passed in if the block did not need to be relocated.
*/
#define memRealloc(pctxt,mem_p,nbytes) \
memHeapRealloc(&(pctxt)->pTypeMemHeap, (void*)mem_p, nbytes)
/**
- * Free memory pointer. This macro frees memory at the given pointer.
- * The memory must have been allocated using the memHeapAlloc (or similar)
- * macros or the mem memory allocation macros. This macro is
+ * Free memory pointer. This macro frees memory at the given pointer.
+ * The memory must have been allocated using the memHeapAlloc (or similar)
+ * macros or the mem memory allocation macros. This macro is
* similar to the C \c free function.
- *
+ *
* @param pctxt - Pointer to a context block
- * @param mem_p - Pointer to memory block to free. This must have
- * been allocated using the memHeapAlloc or memAlloc macro or the
+ * @param mem_p - Pointer to memory block to free. This must have
+ * been allocated using the memHeapAlloc or memAlloc macro or the
* memHeapAlloc function.
*/
#define memFreePtr(pctxt,mem_p) \
memHeapFreePtr(&(pctxt)->pTypeMemHeap, (void*)mem_p)
/**
- * Free memory associated with a context. This macro frees all memory
- * held within a context. This is all memory allocated using the
- * memHeapAlloc (and similar macros) and the mem memory allocation
+ * Free memory associated with a context. This macro frees all memory
+ * held within a context. This is all memory allocated using the
+ * memHeapAlloc (and similar macros) and the mem memory allocation
* functions using the given context variable.
- *
+ *
* @param pctxt - Pointer to a context block
*/
#define memFree(pctxt) \
memHeapFreeAll(&(pctxt)->pTypeMemHeap)
/**
- * Reset memory associated with a context. This macro resets all memory
- * held within a context. This is all memory allocated using the memHeapAlloc
- * (and similar macros) and the mem memory allocation functions using the
+ * Reset memory associated with a context. This macro resets all memory
+ * held within a context. This is all memory allocated using the memHeapAlloc
+ * (and similar macros) and the mem memory allocation functions using the
* given context variable.
*
- * <p>The difference between this and the ASN1MEMFREE macro is that the
- * memory blocks held within the context are not actually freed. Internal
- * pointers are reset so the existing blocks can be reused. This can
- * provide a performace improvement for repetitive tasks such as decoding
+ * <p>The difference between this and the ASN1MEMFREE macro is that the
+ * memory blocks held within the context are not actually freed. Internal
+ * pointers are reset so the existing blocks can be reused. This can
+ * provide a performace improvement for repetitive tasks such as decoding
* messages in a loop.
- *
+ *
* @param pctxt - Pointer to a context block
*/
#define memReset(pctxt) \
memHeapReset(&(pctxt)->pTypeMemHeap)
-/* Alias for __cdecl modifier; if __cdecl keyword is not supported,
+/* Alias for __cdecl modifier; if __cdecl keyword is not supported,
* redefine it as empty macro. */
#if !defined(OSCDECL)
EXTERN void memHeapRelease (void** ppvMemHeap);
EXTERN void memHeapReset (void** ppvMemHeap);
-EXTERN void* memHeapMarkSaved
+EXTERN void* memHeapMarkSaved
(void** ppvMemHeap, const void* mem_p, ASN1BOOL saved);
-EXTERN void memHeapSetProperty
+EXTERN void memHeapSetProperty
(void** ppvMemHeap, ASN1UINT propId, void* pProp);
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeBits
+EXTERN int decodeBits
(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT nbits);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeBitString
+EXTERN int decodeBitString
(OOCTXT* pctxt, ASN1UINT* numbits_p, ASN1OCTET* buffer,
ASN1UINT bufsiz);
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeBMPString
+EXTERN int decodeBMPString
(OOCTXT* pctxt, ASN1BMPString* pvalue, Asn116BitCharSet* permCharSet);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConsInteger
+EXTERN int decodeConsInteger
(OOCTXT* pctxt, ASN1INT* pvalue, ASN1INT lower, ASN1INT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConsUnsigned
+EXTERN int decodeConsUnsigned
(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT lower, ASN1UINT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConsUInt8 (OOCTXT* pctxt,
+EXTERN int decodeConsUInt8 (OOCTXT* pctxt,
ASN1UINT8* pvalue, ASN1UINT lower, ASN1UINT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConsUInt16
+EXTERN int decodeConsUInt16
(OOCTXT* pctxt, ASN1USINT* pvalue, ASN1UINT lower, ASN1UINT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConsWholeNumber
+EXTERN int decodeConsWholeNumber
(OOCTXT* pctxt, ASN1UINT* padjusted_value, ASN1UINT range_value);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeConstrainedStringEx
+EXTERN int decodeConstrainedStringEx
(OOCTXT* pctxt, const char** string, const char* charSet,
ASN1UINT abits, ASN1UINT ubits, ASN1UINT canSetBits);
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeDynOctetString
+EXTERN int decodeDynOctetString
(OOCTXT* pctxt, ASN1DynOctStr* pOctStr);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeOctetString
+EXTERN int decodeOctetString
(OOCTXT* pctxt, ASN1UINT* numocts_p, ASN1OCTET* buffer,
ASN1UINT bufsiz);
/**
* This function will decode an ASN.1 open type. This used to be the ASN.1 ANY
- * type, but now is used in a variety of applications requiring an encoding
- * that can be interpreted by a decoder without prior knowledge of the type
+ * type, but now is used in a variety of applications requiring an encoding
+ * that can be interpreted by a decoder without prior knowledge of the type
* of the variable.
*
* @param pctxt Pointer to a context structure. This provides a storage
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeOpenType
+EXTERN int decodeOpenType
(OOCTXT* pctxt, const ASN1OCTET** object_p2, ASN1UINT* numocts_p);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeSmallNonNegWholeNumber
+EXTERN int decodeSmallNonNegWholeNumber
(OOCTXT* pctxt, ASN1UINT* pvalue);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeSemiConsInteger
+EXTERN int decodeSemiConsInteger
(OOCTXT* pctxt, ASN1INT* pvalue, ASN1INT lower);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int decodeSemiConsUnsigned
+EXTERN int decodeSemiConsUnsigned
(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT lower);
/**
EXTERN int decodeVarWidthCharString (OOCTXT* pctxt, const char** pvalue);
/**
- * This function will encode a variable of the ASN.1 BOOLEAN type in
+ * This function will encode a variable of the ASN.1 BOOLEAN type in
* a single bit.
*
* @param pctxt Pointer to a context structure. This provides a storage
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeBits
+EXTERN int encodeBits
(OOCTXT* pctxt, ASN1UINT value, ASN1UINT nbits);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeBitString
+EXTERN int encodeBitString
(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeBMPString
+EXTERN int encodeBMPString
(OOCTXT* pctxt, ASN1BMPString value, Asn116BitCharSet* permCharSet);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeConstrainedStringEx
+EXTERN int encodeConstrainedStringEx
(OOCTXT* pctxt, const char* string, const char* charSet,
ASN1UINT abits, ASN1UINT ubits, ASN1UINT canSetBits);
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeConsInteger
+EXTERN int encodeConsInteger
(OOCTXT* pctxt, ASN1INT value, ASN1INT lower, ASN1INT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeConsUnsigned
+EXTERN int encodeConsUnsigned
(OOCTXT* pctxt, ASN1UINT value, ASN1UINT lower, ASN1UINT upper);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeConsWholeNumber
+EXTERN int encodeConsWholeNumber
(OOCTXT* pctxt, ASN1UINT adjusted_value, ASN1UINT range_value);
/**
* to get the pointer and length of the message. It is normally used when
* dynamic encoding is specified because the message pointer is not known until
* encoding is complete. If static encoding is used, the message starts at the
- * beginning of the specified buffer adn the encodeGetMsgLen function can be
+ * beginning of the specified buffer adn the encodeGetMsgLen function can be
* used to obtain the lenght of the message.
*
* @param pctxt Pointer to a context structure. This provides a storage
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeOctets
+EXTERN int encodeOctets
(OOCTXT* pctxt, const ASN1OCTET* pvalue, ASN1UINT nbits);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeOctetString
+EXTERN int encodeOctetString
(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeOpenType
+EXTERN int encodeOpenType
(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeOpenTypeExt
+EXTERN int encodeOpenTypeExt
(OOCTXT* pctxt, DList* pElemList);
-EXTERN int encodeOpenTypeExtBits
+EXTERN int encodeOpenTypeExtBits
(OOCTXT* pctxt, DList* pElemList);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeSemiConsInteger
+EXTERN int encodeSemiConsInteger
(OOCTXT* pctxt, ASN1INT value, ASN1INT lower);
/**
* - 0 (ASN_OK) = success,
* - negative return value is error.
*/
-EXTERN int encodeSemiConsUnsigned
+EXTERN int encodeSemiConsUnsigned
(OOCTXT* pctxt, ASN1UINT value, ASN1UINT lower);
/**
#define encodeUnconsInteger(pctxt,value) \
encodeSemiConsInteger(pctxt,value,ASN1INT_MIN)
-EXTERN int encodeVarWidthCharString (OOCTXT* pctxt, const char* value);
+EXTERN int encodeVarWidthCharString (OOCTXT* pctxt, const char* value);
EXTERN int addSizeConstraint (OOCTXT* pctxt, Asn1SizeCnst* pSize);
-EXTERN ASN1BOOL alignCharStr
+EXTERN ASN1BOOL alignCharStr
(OOCTXT* pctxt, ASN1UINT len, ASN1UINT nbits, Asn1SizeCnst* pSize);
-EXTERN int bitAndOctetStringAlignmentTest
-(Asn1SizeCnst* pSizeList, ASN1UINT itemCount,
+EXTERN int bitAndOctetStringAlignmentTest
+(Asn1SizeCnst* pSizeList, ASN1UINT itemCount,
ASN1BOOL bitStrFlag, ASN1BOOL* pAlignFlag);
EXTERN int getPERMsgLen (OOCTXT* pctxt);
EXTERN int checkSizeConstraint(OOCTXT* pctxt, int size);
EXTERN ASN1UINT getUIntBitCount (ASN1UINT value);
-EXTERN Asn1SizeCnst* checkSize
+EXTERN Asn1SizeCnst* checkSize
(Asn1SizeCnst* pSizeList, ASN1UINT value, ASN1BOOL* pExtendable);
-EXTERN void init16BitCharSet
+EXTERN void init16BitCharSet
(Asn116BitCharSet* pCharSet, ASN116BITCHAR first,
ASN116BITCHAR last, ASN1UINT abits, ASN1UINT ubits);
EXTERN ASN1BOOL isExtendableSize (Asn1SizeCnst* pSizeList);
-EXTERN void set16BitCharSet
+EXTERN void set16BitCharSet
(OOCTXT* pctxt, Asn116BitCharSet* pCharSet, Asn116BitCharSet* pAlphabet);
#ifdef __cplusplus
}
#endif
-#endif
+#endif
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#include "asterisk/config.h"
#include "asterisk/netsock2.h"
-#include "ooports.h"
+#include "ooports.h"
#include "oochannels.h"
#include "ootrace.h"
#include "ooq931.h"
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- ret = ooBindPort (OOTCP, channelSocket, call->localIP);
+ ret = ooBindPort (OOTCP, channelSocket, call->localIP);
if(ret == OO_FAILED)
{
OOTRACEERR3("Error:Unable to bind to a TCP port - H245 listener creation"
ret = ooSocketListen(*(call->h245listener), 4096);
if(ret != ASN_OK)
{
- OOTRACEERR3("Error:Unable to listen on H.245 socket (%s, %s)\n",
+ OOTRACEERR3("Error:Unable to listen on H.245 socket (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
-
- OOTRACEINFO4("H245 listener creation - successful(port %d) (%s, %s)\n",
+
+ OOTRACEINFO4("H245 listener creation - successful(port %d) (%s, %s)\n",
*(call->h245listenport),call->callType, call->callToken);
return OO_OK;
}
else
{
if (0 == call->pH245Channel) {
- call->pH245Channel =
+ call->pH245Channel =
(OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));
}
bind socket to a port before connecting. Thus avoiding
implicit bind done by a connect call.
*/
- ret = ooBindPort(OOTCP, channelSocket, call->localIP);
+ ret = ooBindPort(OOTCP, channelSocket, call->localIP);
if(ret == OO_FAILED)
{
OOTRACEERR3("Error:Unable to bind to a TCP port - h245 connection "
return OO_FAILED;
}
call->pH245Channel->port = ret;
- OOTRACEDBGC4("Local H.245 port is %d (%s, %s)\n",
+ OOTRACEDBGC4("Local H.245 port is %d (%s, %s)\n",
call->pH245Channel->port,
call->callType, call->callToken);
OOTRACEINFO5("Trying to connect to remote endpoint to setup H245 "
- "connection %s:%d(%s, %s)\n", call->remoteIP,
+ "connection %s:%d(%s, %s)\n", call->remoteIP,
call->remoteH245Port, call->callType, call->callToken);
-
+
if((ret=ooSocketConnect(channelSocket, call->remoteIP,
call->remoteH245Port))==ASN_OK)
{
if(call->h245ConnectionAttempts >= 3)
{
OOTRACEERR3("Error:Failed to setup an H245 connection with remote "
- "destination. (%s, %s)\n", call->callType,
+ "destination. (%s, %s)\n", call->callType,
call->callToken);
if(call->callState < OO_CALL_CLEAR)
{
"(%s, %s)\n", DEFAULT_H245CONNECTION_RETRYTIMEOUT,
call->callType, call->callToken);
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
OOTRACEERR3("Error:Unable to allocate memory for timer "
- "callback.(%s, %s)\n", call->callType,
+ "callback.(%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
cbData->call = call;
cbData->timerType = OO_H245CONNECT_TIMER;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
- &ooCallH245ConnectionRetryTimerExpired,
- DEFAULT_H245CONNECTION_RETRYTIMEOUT, cbData,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
+ &ooCallH245ConnectionRetryTimerExpired,
+ DEFAULT_H245CONNECTION_RETRYTIMEOUT, cbData,
FALSE))
{
OOTRACEERR3("Error:Unable to create H245 connection retry timer"
iRet = ooEncodeH225Message(call, msg, (char *)encodebuf, MAXMSGLEN);
if(iRet != OO_OK)
{
- OOTRACEERR3("Error:Failed to encode H225 message. (%s, %s)\n",
+ OOTRACEERR3("Error:Failed to encode H225 message. (%s, %s)\n",
call->callType, call->callToken);
memFreePtr (call->pctxt, encodebuf);
return OO_FAILED;
}
/* If high priority messages, send immediately.*/
- if(encodebuf[0] == OOReleaseComplete ||
+ if(encodebuf[0] == OOReleaseComplete ||
(encodebuf[0]==OOFacility && encodebuf[1]==OOEndSessionCommand))
{
dListFreeAll(call->pctxt, &call->pH225Channel->outQueue);
}
else{
dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf);
-
- OOTRACEDBGC4("Queued H225 messages %d. (%s, %s)\n",
- call->pH225Channel->outQueue.count,
- call->callType, call->callToken);
+
+ OOTRACEDBGC4("Queued H225 messages %d. (%s, %s)\n",
+ call->pH225Channel->outQueue.count,
+ call->callType, call->callToken);
}
return OO_OK;
}
{
/*
bind socket to a port before connecting. Thus avoiding
- implicit bind done by a connect call. Avoided on windows as
+ implicit bind done by a connect call. Avoided on windows as
windows sockets have problem in reusing the addresses even after
setting SO_REUSEADDR, hence in windows we just allow os to bind
to any random port.
*/
#ifndef _WIN32
- ret = ooBindPort(OOTCP,channelSocket, call->localIP);
+ ret = ooBindPort(OOTCP,channelSocket, call->localIP);
#else
ret = ooBindOSAllocatedPort(channelSocket, call->localIP);
#endif
-
+
if(ret == OO_FAILED)
{
- OOTRACEERR3("Error:Unable to bind to a TCP port (%s, %s)\n",
+ OOTRACEERR3("Error:Unable to bind to a TCP port (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
{
}
if (0 == call->pH225Channel) {
- call->pH225Channel =
+ call->pH225Channel =
(OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));
}
call->pH225Channel->port = ret;
OOTRACEINFO6("Trying to connect to remote endpoint(%s:%d) (IPv%d) to setup "
- "H2250 channel (%s, %s)\n", call->remoteIP,
+ "H2250 channel (%s, %s)\n", call->remoteIP,
call->remotePort, call->versionIP, call->callType, call->callToken);
if((ret=ooSocketConnect(channelSocket, call->remoteIP,
if(!strcmp(call->localIP, "0.0.0.0") || !strcmp(call->localIP, "::"))
{
OOTRACEDBGA3("Determining IP address for outgoing call in "
- "multihomed mode. (%s, %s)\n", call->callType,
+ "multihomed mode. (%s, %s)\n", call->callType,
call->callToken);
- ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 2+8*4+7,
+ ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 2+8*4+7,
&call->pH225Channel->port, NULL);
if(ret != ASN_OK)
{
OOTRACEERR3("ERROR:Failed to retrieve local ip and port from "
- "socket for multihomed mode.(%s, %s)\n",
+ "socket for multihomed mode.(%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
{ /* transport failure */
return OO_FAILED;
}
OOTRACEDBGA4("Using local ip %s for outgoing call(multihomedMode)."
- " (%s, %s)\n", call->localIP, call->callType,
+ " (%s, %s)\n", call->localIP, call->callType,
call->callToken);
}
return OO_OK;
OOTRACEERR1("Failed to create socket for H323 Listener\n");
return OO_FAILED;
}
- if((ret=ooSocketBind (channelSocket, ipaddrs,
- gH323ep.listenPort))==ASN_OK)
+ if((ret=ooSocketBind (channelSocket, ipaddrs,
+ gH323ep.listenPort))==ASN_OK)
{
gH323ep.listener = (OOSOCKET*)memAlloc(&gH323ep.ctxt,sizeof(OOSOCKET));
*(gH323ep.listener) = channelSocket;
-
+
ooSocketListen(channelSocket,2048); /*listen on socket*/
OOTRACEINFO1("H323 listener creation - successful\n");
return OO_OK;
-int ooAcceptH225Connection()
+int ooAcceptH225Connection()
{
OOH323CallData * call;
int ret;
OOSOCKET h225Channel=0;
memset(remoteIP, 0, sizeof(remoteIP));
- ret = ooSocketAccept (*(gH323ep.listener), &h225Channel,
+ ret = ooSocketAccept (*(gH323ep.listener), &h225Channel,
remoteIP, NULL);
if(ret != ASN_OK)
{
}
ast_mutex_lock(&call->Lock);
- call->pH225Channel = (OOH323Channel*)
+ call->pH225Channel = (OOH323Channel*)
memAllocZ (call->pctxt, sizeof(OOH323Channel));
call->pH225Channel->sock = h225Channel;
"mode (%s, %s)\n", call->callType, call->callToken);
}
- ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 2+8*4+7,
+ ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 2+8*4+7,
&call->pH225Channel->port, &call->versionIP);
if(ret != ASN_OK)
{
OOTRACEERR3("Error:Failed to retrieve local ip and port from "
- "socket for multihomed mode.(%s, %s)\n",
+ "socket for multihomed mode.(%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
{ /* transport failure */
return OO_FAILED;
}
OOTRACEDBGA5("Using Local IP address %s (IPv%d) for incoming call "
- "(%s, %s)\n", call->localIP, call->versionIP, call->callType,
+ "(%s, %s)\n", call->localIP, call->versionIP, call->callType,
call->callToken);
if (remoteIP[0]) {
strncpy(call->remoteIP, remoteIP, strlen(remoteIP));
}
-
+
ast_mutex_unlock(&call->Lock);
return OO_OK;
}
{
int ret;
OOSOCKET h245Channel=0;
- ret = ooSocketAccept (*(call->h245listener), &h245Channel,
+ ret = ooSocketAccept (*(call->h245listener), &h245Channel,
NULL, NULL);
if(ret != ASN_OK)
{
}
if (0 == call->pH245Channel) {
- call->pH245Channel =
+ call->pH245Channel =
(OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));
}
- call->pH245Channel->sock = h245Channel;
+ call->pH245Channel->sock = h245Channel;
call->h245SessionState = OO_H245SESSION_ACTIVE;
- OOTRACEINFO3("H.245 connection established (%s, %s)\n",
+ OOTRACEINFO3("H.245 connection established (%s, %s)\n",
call->callType, call->callToken);
return OO_OK;
pfds[*nfds].events = POLLIN;
if (call->pH225Channel->outQueue.count > 0 ||
- (OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
- 0 != call->pH245Channel &&
+ (OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
+ 0 != call->pH245Channel &&
call->pH245Channel->outQueue.count>0))
pfds[*nfds].events |= POLLOUT;
(*nfds)++;
}
-
+
if (0 != call->pH245Channel && call->pH245Channel->sock != 0) {
pfds[*nfds].fd = call->pH245Channel->sock;
pfds[*nfds].events = POLLIN;
return OO_OK;
}
-
+
int ooProcessFDSETsAndTimers
(struct pollfd* pfds, int nfds, struct timeval *pToMin)
{
/* Process gatekeeper client timers */
if(gH323ep.gkClient)
- {
- ooTimerFireExpired(&gH323ep.gkClient->ctxt,
+ {
+ ooTimerFireExpired(&gH323ep.gkClient->ctxt,
&gH323ep.gkClient->timerList);
if(ooTimerNextTimeout(&gH323ep.gkClient->timerList, &toNext))
{
{
OOTRACEDBGA1("New connection at H225 receiver\n");
ooAcceptH225Connection();
- }
+ }
}
-
-
+
+
return OO_OK;
}
OOTRACEDBGC3("Incoming H.245 connection (%s, %s)\n",
call->callType, call->callToken);
ooAcceptH245Connection(call);
- }
+ }
}
if (0 != call->pH225Channel && 0 != call->pH225Channel->sock)
{
if (call->pH225Channel->outQueue.count>0)
{
- OOTRACEDBGC3("Sending H225 message (%s, %s)\n",
+ OOTRACEDBGC3("Sending H225 message (%s, %s)\n",
call->callType, call->callToken);
if (ooSendMsg(call, OOQ931MSG) != OO_OK)
OOTRACEERR1("Error in sending h225 message\n");
}
- if(call->pH245Channel &&
- call->pH245Channel->outQueue.count>0 &&
+ if(call->pH245Channel &&
+ call->pH245Channel->outQueue.count>0 &&
OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OOTRACEDBGC3("H245 message needs to be tunneled. "
- "(%s, %s)\n", call->callType,
+ "(%s, %s)\n", call->callType,
call->callToken);
if (ooSendMsg(call, OOH245MSG) != OO_OK)
OOTRACEERR1("Error in sending h245 message\n");
}
- }
+ }
}
if(ooTimerNextTimeout(&call->timerList, &toNext))
return OO_OK;
}
-
+
int ooMonitorCmdChannels()
{
int ret=0, nfds=0;
toMin.tv_sec = 3;
toMin.tv_usec = 0;
-
+
while(1)
{
nfds = 0;
break;
}
-
+
if(nfds == 0)
#ifdef _WIN32
Sleep(10);
#endif
else
ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000);
-
+
if(ret == -1)
{
-
+
OOTRACEERR1("Error in poll ...exiting\n");
- exit(-1);
+ exit(-1);
continue;
}
toMin.tv_sec = 3;
toMin.tv_usec = 0;
ooH323EpPrintConfig();
-
+
if(gH323ep.gkClient) {
ooGkClientPrintConfig(gH323ep.gkClient);
if(OO_OK != ooGkClientStart(gH323ep.gkClient))
// ooGkClientDestroy();
}
}
-
+
while(1)
{
nfds = 0;
break;
}
-
+
if(nfds == 0)
#ifdef _WIN32
Sleep(10);
#endif
else
ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000);
-
+
if(ret == -1)
{
-
+
OOTRACEERR1("Error in poll ...exiting\n");
exit(-1);
}
toMin.tv_sec = 2; /* 2 sec */
toMin.tv_usec = 100000; /* 100ms*/
/*This is for test application. Not part of actual stack */
-
+
ast_mutex_lock(&monitorLock);
ooTimerFireExpired(&gH323ep.ctxt, &g_TimerList);
if(ooTimerNextTimeout(&g_TimerList, &toNext))
toMin.tv_sec = 3;
toMin.tv_usec = 0;
-
+
while(1)
{
if(!call->Monitor) {
nfds = 0;
ooSetCallFDSETs(call, pfds, &nfds);
-
+
if(nfds == 0)
#ifdef _WIN32
Sleep(10);
#endif
else
ret = ooSocketPoll(pfds, nfds, toMin.tv_sec * 1000 + toMin.tv_usec / 1000);
-
+
if(ret == -1)
{
-
+
OOTRACEERR2("Error in poll %d ...exiting\n", errno);
call->callEndReason = OO_REASON_INVALIDMESSAGE;
call->callState = OO_CALL_CLEARED;
toMin.tv_sec = 2; /* 2 sec */
toMin.tv_usec = 100000; /* 100ms*/
/*This is for test application. Not part of actual stack */
-
+
if(ooProcessCallFDSETsAndTimers(call, pfds, nfds, &toMin) != OO_OK)
{
ooStopMonitorCallChannels(call);
int len;
Q931Message *pmsg;
OOCTXT *pctxt = call->msgctxt;
-
+
struct timeval timeout;
-
+
pmsg = (Q931Message*)memAlloc(pctxt, sizeof(Q931Message));
if(!pmsg)
{
if(call->callState < OO_CALL_CLEAR)
call->callEndReason = OO_REASON_TRANSPORTFAILURE;
call->callState = OO_CALL_CLEARED;
-
+
}
ooFreeQ931Message(pctxt, pmsg);
return OO_OK;
}
OOTRACEDBGC3("Receiving H.2250 message (%s, %s)\n",
- call->callType, call->callToken);
+ call->callType, call->callToken);
/* Since we are working with TCP, need to determine the
message boundary. Has to be done at channel level, as channels
know the message formats and can determine boundaries
if(recvLen != 4)
{
OOTRACEERR4("Error: Reading TPKT header for H225 message "
- "recvLen= %d (%s, %s)\n", recvLen, call->callType,
+ "recvLen= %d (%s, %s)\n", recvLen, call->callType,
call->callToken);
ooFreeQ931Message(pctxt, pmsg);
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
-
+
len = message[2];
len = len<<8;
len = len | message[3];
if(len > MAXMSGLEN - 4)
{
OOTRACEERR4("Error: Invalid TPKT header for H225 message "
- "Len = %d (%s, %s)\n", len, call->callType,
+ "Len = %d (%s, %s)\n", len, call->callType,
call->callToken);
ooCloseH225Connection(call);
ooFreeQ931Message(pctxt, pmsg);
}
/* Now read actual Q931 message body. We should make sure that we
- receive complete message as indicated by len. If we don't then there
+ receive complete message as indicated by len. If we don't then there
is something wrong. The loop below receives message, then checks whether
complete message is received. If not received, then uses select to peek
for remaining bytes of the message. If message is not received in 3
while(total < len)
{
struct pollfd pfds;
-
+
pfds.fd = call->pH225Channel->sock;
pfds.events = POLLIN;
timeout.tv_sec = 3;
if(ret == -1)
{
OOTRACEERR3("Error in select while receiving H.2250 message - "
- "clearing call (%s, %s)\n", call->callType,
+ "clearing call (%s, %s)\n", call->callType,
call->callToken);
ooFreeQ931Message(pctxt, pmsg);
if(call->callState < OO_CALL_CLEAR)
ooFreeQ931Message(pctxt, pmsg);
if(call->callState < OO_CALL_CLEAR)
{
- call->callEndReason = OO_REASON_INVALIDMESSAGE;
+ call->callEndReason = OO_REASON_INVALIDMESSAGE;
call->callState = OO_CALL_CLEAR;
}
return OO_FAILED;
recvLen = ooSocketRecv (call->pH225Channel->sock, message1, len-total);
if (recvLen == 0) {
OOTRACEERR3("Error in read while receiving H.2250 message - "
- "clearing call (%s, %s)\n", call->callType,
+ "clearing call (%s, %s)\n", call->callType,
call->callToken);
ooFreeQ931Message(pctxt, pmsg);
if(call->callState < OO_CALL_CLEAR)
}
- OOTRACEDBGC3("Received Q.931 message: (%s, %s)\n",
+ OOTRACEDBGC3("Received Q.931 message: (%s, %s)\n",
call->callType, call->callToken);
initializePrintHandler(&printHandler, "Received H.2250 Message");
OOTRACEERR3("Error:Failed to decode received H.2250 message. (%s, %s)\n",
call->callType, call->callToken);
}
- OOTRACEDBGC3("Decoded Q931 message (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Decoded Q931 message (%s, %s)\n", call->callType,
call->callToken);
finishPrint();
removeEventHandler(pctxt);
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
OOCTXT *pctxt = call->pctxt;
struct timeval timeout;
-
+
pmsg = (H245Message*)memAlloc(pctxt, sizeof(H245Message));
/* First read just TPKT header which is four bytes */
}
return OO_FAILED;
}
- if(call->h245SessionState == OO_H245SESSION_PAUSED)
+ if(call->h245SessionState == OO_H245SESSION_PAUSED)
{
ooLogicalChannel *temp;
/* Remaining message length is length - tpkt length */
len = len - 4;
/* Now read actual H245 message body. We should make sure that we
- receive complete message as indicated by len. If we don't then there
+ receive complete message as indicated by len. If we don't then there
is something wrong. The loop below receives message, then checks whether
complete message is received. If not received, then uses select to peek
for remaining bytes of the message. If message is not received in 3
}
return OO_FAILED;
}
- /* If remaining part of the message is not received in 3 seconds
+ /* If remaining part of the message is not received in 3 seconds
exit */
if(!ooPDRead(&pfds, 1, call->pH245Channel->sock))
{
}
}
- OOTRACEDBGC3("Complete H245 message received (%s, %s)\n",
+ OOTRACEDBGC3("Complete H245 message received (%s, %s)\n",
call->callType, call->callToken);
setPERBuffer(pctxt, message, recvLen, aligned);
initializePrintHandler(&printHandler, "Received H.245 Message");
ret = asn1PD_H245MultimediaSystemControlMessage(pctxt, &(pmsg->h245Msg));
if(ret != ASN_OK)
{
- OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
+ OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
call->callType, call->callToken);
ooFreeH245Message(call, pmsg);
return OO_FAILED;
}
finishPrint();
- removeEventHandler(pctxt);
+ removeEventHandler(pctxt);
ooHandleH245Message(call, pmsg);
return OO_OK;
}
/* Generic Send Message functionality. Based on type of message to be sent,
- it calls the corresponding function to retrieve the message buffer and
+ it calls the corresponding function to retrieve the message buffer and
then transmits on the associated channel
Interpreting msgptr:
Q931 messages except facility
1st octet - msgType, next 4 octets - tpkt header,
followed by encoded msg
Q931 message facility
- 1st octect - OOFacility, 2nd octet - tunneled msg
- type(in case no tunneled msg - OOFacility),
- 3rd and 4th octet - associated logical channel
- of the tunneled msg(0 when no channel is
- associated. ex. in case of MSD, TCS), next
- 4 octets - tpkt header, followed by encoded
+ 1st octect - OOFacility, 2nd octet - tunneled msg
+ type(in case no tunneled msg - OOFacility),
+ 3rd and 4th octet - associated logical channel
+ of the tunneled msg(0 when no channel is
+ associated. ex. in case of MSD, TCS), next
+ 4 octets - tpkt header, followed by encoded
message.
H.245 messages no tunneling
- 1st octet - msg type, next two octets - logical
+ 1st octet - msg type, next two octets - logical
channel number(0, when no channel is associated),
next two octets - total length of the message
(including tpkt header)
H.245 messages - tunneling.
- 1st octet - msg type, next two octets - logical
+ 1st octet - msg type, next two octets - logical
channel number(0, when no channel is associated),
- next two octets - total length of the message.
+ next two octets - total length of the message.
Note, no tpkt header is present in this case.
-
+
*/
int ooSendMsg(OOH323CallData *call, int type)
{
int len=0, ret=0, msgType=0, tunneledMsgType=0, logicalChannelNo = 0;
DListNode * p_msgNode=NULL;
ASN1OCTET *msgptr, *msgToSend=NULL;
-
+
if(call->callState == OO_CALL_CLEARED)
{
if(call->pH225Channel->outQueue.count == 0)
{
- OOTRACEWARN3("WARN:No H.2250 message to send. (%s, %s)\n",
+ OOTRACEWARN3("WARN:No H.2250 message to send. (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
- OOTRACEDBGA3("Sending Q931 message (%s, %s)\n", call->callType,
+ OOTRACEDBGA3("Sending Q931 message (%s, %s)\n", call->callType,
call->callToken);
p_msgNode = call->pH225Channel->outQueue.head;
msgptr = (ASN1OCTET*) p_msgNode->data;
dListRemove(&(call->pH225Channel->outQueue), p_msgNode);
if(p_msgNode)
memFreePtr(call->pctxt, p_msgNode);
-
+
/*TODO: This is not required ideally. We will see for some time and if
we don't face any problems we will delete this code */
-#if 0
+#if 0
/* Check whether connection with remote is alright */
if(!ooChannelsIsConnectionOK(call, call->pH225Channel->sock))
{
call->callState = OO_CALL_CLEARED;
return OO_OK;
}
-#endif
- /* Send message out via TCP */
+#endif
+ /* Send message out via TCP */
ret = ooSocketSend(call->pH225Channel->sock, msgToSend, len);
if(ret == ASN_OK)
{
memFreePtr (call->pctxt, msgptr);
- OOTRACEDBGC3("H2250/Q931 Message sent successfully (%s, %s)\n",
+ OOTRACEDBGC3("H2250/Q931 Message sent successfully (%s, %s)\n",
call->callType, call->callToken);
ooOnSendMsg(call, msgType, tunneledMsgType, logicalChannelNo);
return OO_OK;
}
else{
- OOTRACEERR3("H2250Q931 Message send failed (%s, %s)\n",
+ OOTRACEERR3("H2250Q931 Message send failed (%s, %s)\n",
call->callType, call->callToken);
memFreePtr (call->pctxt, msgptr);
if(call->callState < OO_CALL_CLEAR)
{
if(call->pH245Channel->outQueue.count == 0)
{
- OOTRACEWARN3("WARN:No H.245 message to send. (%s, %s)\n",
+ OOTRACEWARN3("WARN:No H.245 message to send. (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
- OOTRACEDBGA3("Sending H245 message (%s, %s)\n", call->callType,
+ OOTRACEDBGA3("Sending H245 message (%s, %s)\n", call->callType,
call->callToken);
p_msgNode = call->pH245Channel->outQueue.head;
msgptr = (ASN1OCTET*) p_msgNode->data;
}
return OO_OK;
}
-
+
if (0 != call->pH245Channel && 0 != call->pH245Channel->sock)
{
OOTRACEDBGC4("Sending %s H245 message over H.245 channel. "
- "(%s, %s)\n", ooGetMsgTypeText(msgType),
+ "(%s, %s)\n", ooGetMsgTypeText(msgType),
call->callType, call->callToken);
ret = ooSocketSend(call->pH245Channel->sock, msgptr+5, len);
if(ret == ASN_OK)
{
memFreePtr (call->pctxt, msgptr);
- OOTRACEDBGA3("H245 Message sent successfully (%s, %s)\n",
+ OOTRACEDBGA3("H245 Message sent successfully (%s, %s)\n",
call->callType, call->callToken);
ooOnSendMsg(call, msgType, tunneledMsgType, logicalChannelNo);
return OO_OK;
}
else{
memFreePtr (call->pctxt, msgptr);
- OOTRACEERR3("ERROR:H245 Message send failed (%s, %s)\n",
+ OOTRACEERR3("ERROR:H245 Message send failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
{
}
else if(OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OOTRACEDBGC4("Sending %s H245 message as a tunneled message."
- "(%s, %s)\n", ooGetMsgTypeText(msgType),
+ "(%s, %s)\n", ooGetMsgTypeText(msgType),
call->callType, call->callToken);
ret = ooSendAsTunneledMessage
OOTRACEWARN3("ERROR:Unknown message type - message not Sent (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
-}
+}
int ooCloseH245Connection(OOH323CallData *call)
{
- OOTRACEINFO3("Closing H.245 connection (%s, %s)\n", call->callType,
+ OOTRACEINFO3("Closing H.245 connection (%s, %s)\n", call->callType,
call->callToken);
if (0 != call->pH245Channel)
dListFreeAll(call->pctxt, &(call->pH245Channel->outQueue));
memFreePtr (call->pctxt, call->pH245Channel);
call->pH245Channel = NULL;
- OOTRACEDBGC3("Closed H245 connection. (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Closed H245 connection. (%s, %s)\n", call->callType,
call->callToken);
}
call->h245SessionState = OO_H245SESSION_CLOSED;
int ooCloseH245Listener(OOH323CallData *call)
{
- OOTRACEINFO3("Closing H.245 Listener (%s, %s)\n", call->callType,
+ OOTRACEINFO3("Closing H.245 Listener (%s, %s)\n", call->callType,
call->callToken);
if(call->h245listener)
{
switch(msgType)
{
case OOSetup:
- OOTRACEINFO3("Sent Message - Setup (%s, %s)\n", call->callType,
+ OOTRACEINFO3("Sent Message - Setup (%s, %s)\n", call->callType,
call->callToken);
/* Start call establishment timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
call->callState = OO_CALL_CLEARED;
else{
call->callState = OO_CALL_CLEAR_RELEASESENT;
- if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK) &&
+ if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK) &&
gH323ep.gkClient->state == GkClientRegistered){
OOTRACEDBGA3("Sending DRQ after sending ReleaseComplete."
"(%s, %s)\n", call->callType, call->callToken);
}
}
- if(call->callState == OO_CALL_CLEAR_RELEASESENT &&
+ if(call->callState == OO_CALL_CLEAR_RELEASESENT &&
call->h245SessionState == OO_H245SESSION_IDLE)
{
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
cbData->call = call;
cbData->timerType = OO_SESSION_TIMER;
cbData->channelNumber = 0;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
&ooSessionTimerExpired, gH323ep.sessionTimeout, cbData, FALSE))
{
OOTRACEERR3("Error:Unable to create EndSession timer- "
- "ReleaseComplete.(%s, %s)\n", call->callType,
+ "ReleaseComplete.(%s, %s)\n", call->callType,
call->callToken);
memFreePtr(call->pctxt, cbData);
return OO_FAILED;
case OOFacility:
if(tunneledMsgType == OOFacility)
{
- OOTRACEINFO3("Sent Message - Facility. (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - Facility. (%s, %s)\n",
call->callType, call->callToken);
}
else{
- OOTRACEINFO4("Sent Message - Facility(%s) (%s, %s)\n",
- ooGetMsgTypeText(tunneledMsgType),
+ OOTRACEINFO4("Sent Message - Facility(%s) (%s, %s)\n",
+ ooGetMsgTypeText(tunneledMsgType),
call->callType, call->callToken);
ooOnSendMsg(call, tunneledMsgType, 0, associatedChan);
case OOMasterSlaveDetermination:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - MasterSlaveDetermination (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - MasterSlaveDetermination (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - MasterSlaveDetermination (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - MasterSlaveDetermination (%s, %s)\n",
call->callType, call->callToken);
/* Start MSD timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
OOTRACEINFO3("Tunneled Message - MasterSlaveDeterminationAck (%s, %s)"
"\n", call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - MasterSlaveDeterminationAck (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - MasterSlaveDeterminationAck (%s, %s)\n",
call->callType, call->callToken);
break;
case OOMasterSlaveReject:
break;
case OOTerminalCapabilitySet:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
- /* If session isn't marked active yet, do it. possible in case of
+ /* If session isn't marked active yet, do it. possible in case of
tunneling */
if(call->h245SessionState == OO_H245SESSION_IDLE ||
call->h245SessionState == OO_H245SESSION_PAUSED) {
call->h245SessionState = OO_H245SESSION_ACTIVE;
}
- OOTRACEINFO3("Tunneled Message - TerminalCapabilitySet (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - TerminalCapabilitySet (%s, %s)\n",
call->callType, call->callToken);
}
else {
- OOTRACEINFO3("Sent Message - TerminalCapabilitySet (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - TerminalCapabilitySet (%s, %s)\n",
call->callType, call->callToken);
}
/* Start TCS timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
OOTRACEINFO3("Tunneled Message - TerminalCapabilitySetAck (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - TerminalCapabilitySetAck (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - TerminalCapabilitySetAck (%s, %s)\n",
call->callType, call->callToken);
break;
case OOTerminalCapabilitySetReject:
OOTRACEINFO3("Tunneled Message - TerminalCapabilitySetReject "
"(%s, %s)\n", call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - TerminalCapabilitySetReject (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - TerminalCapabilitySetReject (%s, %s)\n",
call->callType, call->callToken);
break;
case OOOpenLogicalChannel:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO4("Tunneled Message - OpenLogicalChannel(%d). (%s, %s)\n",
+ OOTRACEINFO4("Tunneled Message - OpenLogicalChannel(%d). (%s, %s)\n",
associatedChan, call->callType, call->callToken);
else
- OOTRACEINFO4("Sent Message - OpenLogicalChannel(%d). (%s, %s)\n",
+ OOTRACEINFO4("Sent Message - OpenLogicalChannel(%d). (%s, %s)\n",
associatedChan, call->callType, call->callToken);
/* Start LogicalChannel timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
cbData->call = call;
cbData->timerType = OO_OLC_TIMER;
cbData->channelNumber = associatedChan;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
- &ooOpenLogicalChannelTimerExpired, gH323ep.logicalChannelTimeout,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
+ &ooOpenLogicalChannelTimerExpired, gH323ep.logicalChannelTimeout,
cbData, FALSE))
{
OOTRACEERR3("Error:Unable to create OpenLogicalChannel timer. "
memFreePtr(call->pctxt, cbData);
return OO_FAILED;
}
-
+
break;
case OOOpenLogicalChannelAck:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
OOTRACEINFO4("Tunneled Message - OpenLogicalChannelAck(%d) (%s,%s)\n",
associatedChan, call->callType, call->callToken);
else
- OOTRACEINFO4("Sent Message - OpenLogicalChannelAck(%d) (%s, %s)\n",
+ OOTRACEINFO4("Sent Message - OpenLogicalChannelAck(%d) (%s, %s)\n",
associatedChan, call->callType, call->callToken);
break;
case OOOpenLogicalChannelReject:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
OOTRACEINFO4("Tunneled Message - OpenLogicalChannelReject(%d)"
- "(%s, %s)\n", associatedChan, call->callType,
+ "(%s, %s)\n", associatedChan, call->callType,
call->callToken);
else
OOTRACEINFO4("Sent Message - OpenLogicalChannelReject(%d) (%s, %s)\n",
break;
case OOEndSessionCommand:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - EndSessionCommand(%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - EndSessionCommand(%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - EndSessionCommand (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - EndSessionCommand (%s, %s)\n",
call->callType, call->callToken);
if((call->h245SessionState == OO_H245SESSION_ACTIVE))
- {
+ {
/* Start EndSession timer */
call->h245SessionState = OO_H245SESSION_ENDSENT;
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
cbData->call = call;
cbData->timerType = OO_SESSION_TIMER;
cbData->channelNumber = 0;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
&ooSessionTimerExpired, gH323ep.sessionTimeout, cbData, FALSE))
{
OOTRACEERR3("Error:Unable to create EndSession timer. "
break;
case OOCloseLogicalChannel:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - CloseLogicalChannel (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - CloseLogicalChannel (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - CloseLogicalChannel (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - CloseLogicalChannel (%s, %s)\n",
call->callType, call->callToken);
/* Start LogicalChannel timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
cbData->call = call;
cbData->timerType = OO_CLC_TIMER;
cbData->channelNumber = associatedChan;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
- &ooCloseLogicalChannelTimerExpired, gH323ep.logicalChannelTimeout,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
+ &ooCloseLogicalChannelTimerExpired, gH323ep.logicalChannelTimeout,
cbData, FALSE))
{
OOTRACEERR3("Error:Unable to create CloseLogicalChannel timer. "
memFreePtr(call->pctxt, cbData);
return OO_FAILED;
}
-
+
break;
case OOCloseLogicalChannelAck:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - CloseLogicalChannelAck (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - CloseLogicalChannelAck (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - CloseLogicalChannelAck (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - CloseLogicalChannelAck (%s, %s)\n",
call->callType, call->callToken);
break;
case OORequestChannelClose:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - RequestChannelClose (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - RequestChannelClose (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - RequestChannelClose (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - RequestChannelClose (%s, %s)\n",
call->callType, call->callToken);
/* Start RequestChannelClose timer */
- cbData = (ooTimerCallback*) memAlloc(call->pctxt,
+ cbData = (ooTimerCallback*) memAlloc(call->pctxt,
sizeof(ooTimerCallback));
if(!cbData)
{
cbData->call = call;
cbData->timerType = OO_RCC_TIMER;
cbData->channelNumber = associatedChan;
- if(!ooTimerCreate(call->pctxt, &call->timerList,
- &ooRequestChannelCloseTimerExpired, gH323ep.logicalChannelTimeout,
+ if(!ooTimerCreate(call->pctxt, &call->timerList,
+ &ooRequestChannelCloseTimerExpired, gH323ep.logicalChannelTimeout,
cbData, FALSE))
{
OOTRACEERR3("Error:Unable to create RequestChannelClose timer. "
break;
case OORequestChannelCloseAck:
if(OO_TESTFLAG (call->flags, OO_M_TUNNELING))
- OOTRACEINFO3("Tunneled Message - RequestChannelCloseAck (%s, %s)\n",
+ OOTRACEINFO3("Tunneled Message - RequestChannelCloseAck (%s, %s)\n",
call->callType, call->callToken);
else
- OOTRACEINFO3("Sent Message - RequestChannelCloseAck (%s, %s)\n",
+ OOTRACEINFO3("Sent Message - RequestChannelCloseAck (%s, %s)\n",
call->callType, call->callToken);
break;
-
+
default:
;
}
call = gH323ep.callList;
while(call)
{
- OOTRACEWARN3("Clearing call (%s, %s)\n", call->callType,
+ OOTRACEWARN3("Clearing call (%s, %s)\n", call->callType,
call->callToken);
call->callEndReason = OO_REASON_LOCAL_CLEARED;
ooCleanCall(call);
}
gH323ep.callList = NULL;
}
- OOTRACEINFO1("Stopping listener for incoming calls\n");
+ OOTRACEINFO1("Stopping listener for incoming calls\n");
if(gH323ep.listener)
{
ooSocketClose(*(gH323ep.listener));
char buf[2];
if(ooSocketRecvPeek(sock, (ASN1OCTET*) buf, 2) == 0)
{
- OOTRACEWARN3("Broken pipe detected. (%s, %s)", call->callType,
+ OOTRACEWARN3("Broken pipe detected. (%s, %s)", call->callType,
call->callToken);
if(call->callState < OO_CALL_CLEAR)
call->callEndReason = OO_REASON_TRANSPORTFAILURE;
}
}
return TRUE;
-}
+}
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file oochannels.h
- * This file contains functions to create and use channels.
+ * @file oochannels.h
+ * This file contains functions to create and use channels.
*/
#ifndef _OOCHANNELS_H_
#define _OOCHANNELS_H_
struct OOH323CallData;
struct Q931Message;
-/**
+/**
* @defgroup channels Channel Management
* @{
*/
/**
* This function is used to create a listener for incoming H.245 connections.
* @param call Pointer to call for which H.245 listener has to be created
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooCreateH245Listener(struct OOH323CallData *call);
/**
* This function is used to accept incoming H.225 connections.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooAcceptH225Connection(void);
* This function is used to accept an incoming H.245 connection.
* @param call Pointer to a call for which H.245 connection request has
* arrived.
- *
+ *
* @return OO_OK, on succes. OO_FAILED, on failure.
*/
EXTERN int ooAcceptH245Connection(struct OOH323CallData *call);
/**
* This function is used to create an H.225 connection to the remote end point.
- * @param call Pointer to the call for which H.225 connection has to be
+ * @param call Pointer to the call for which H.225 connection has to be
* setup.
- * @return OO_OK, on succes. OO_FAILED, on failure.
+ * @return OO_OK, on succes. OO_FAILED, on failure.
*/
EXTERN int ooCreateH225Connection(struct OOH323CallData *call);
/**
* This function is used to close an H.225 connection
- * @param call Pointer to the call for which H.225 connection has to be
+ * @param call Pointer to the call for which H.225 connection has to be
* closed.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooCloseH225Connection(struct OOH323CallData *call);
/**
- * This function is used to close an H.245 connection for a call.
+ * This function is used to close an H.245 connection for a call.
*
- * @param call Pointer to call for which H.245 connection has
+ * @param call Pointer to call for which H.245 connection has
* to be closed.
* @return OO_OK, on success. OO_FAILED, on failure.
*/
/**
* This function is used to start monitoring channels for the calls. It has
* an infinite loop which uses select to monitor various channels.
- *
+ *
*/
EXTERN int ooMonitorChannels(void);
EXTERN int ooMonitorCmdChannels(void);
/**
* This function is used to receive an H.2250 message received on a calls
- * H.225 channel. It receives the message, decodes it and calls
+ * H.225 channel. It receives the message, decodes it and calls
* 'ooHandleH2250Message' to process the message.
- * @param call Pointer to the call for which the message has to be
+ * @param call Pointer to the call for which the message has to be
* received.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH2250Receive(struct OOH323CallData *call);
/**
* This function is used to receive an H.245 message received on a calls
- * H.245 channel. It receives the message, decodes it and calls
+ * H.245 channel. It receives the message, decodes it and calls
* 'ooHandleH245Message' to process it.
- * @param call Pointer to the call for which the message has to be
+ * @param call Pointer to the call for which the message has to be
* received.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH245Receive(struct OOH323CallData *call);
EXTERN int ooSendH225Msg(struct OOH323CallData *call, struct Q931Message *msg);
/**
- * This function is used to Send a message on the channel, when channel is
+ * This function is used to Send a message on the channel, when channel is
* available for write.
* @param call Pointer to call for which message has to be sent.
* @param type Type of the message.
* @return OO_OK, on success. OO_FAILED, on failure
*/
EXTERN int ooOnSendMsg
- (struct OOH323CallData *call, int msgType, int tunneledMsgType,
+ (struct OOH323CallData *call, int msgType, int tunneledMsgType,
int associatedChan);
/**
- * This function is used to check the status of tcp connection.
+ * This function is used to check the status of tcp connection.
* @param call Handle to the call to which connection belongs.
* @param sock Connected socket.
*
*/
EXTERN OOBOOL ooChannelsIsConnectionOK(OOH323CallData *call, OOSOCKET sock);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
}
#endif
#endif
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
switch(type)
{
case T_H245MultimediaSystemControlMessage_request:
- (*pph245msg)->h245Msg.u.request = (H245RequestMessage*)
+ (*pph245msg)->h245Msg.u.request = (H245RequestMessage*)
memAllocZ (pctxt, sizeof(H245RequestMessage));
/*Check for successful mem allocation, and if successful initialize
}
#ifndef _COMPACT
-static void ooPrintH245Message
+static void ooPrintH245Message
(OOH323CallData* call, ASN1OCTET* msgbuf, ASN1UINT msglen)
{
OOCTXT ctxt;
ret = asn1PD_H245MultimediaSystemControlMessage(&ctxt, &mmMsg);
if(ret != ASN_OK)
{
- OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
+ OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
call->callType, call->callToken);
OOTRACEERR1 (errGetText (&ctxt));
}
finishPrint();
- freeContext(&ctxt);
+ freeContext(&ctxt);
}
#endif
if(!msgbuf || size<200)
{
OOTRACEERR3("Error: Invalid message buffer/size for "
- "ooEncodeH245Message. (%s, %s)\n",
+ "ooEncodeH245Message. (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
/* This will contain the total length of the encoded message */
msgbuf[i++] = 0;
msgbuf[i++] = 0;
-
+
if(!OO_TESTFLAG (call->flags, OO_M_TUNNELING))
{
/* Populate message buffer to be returned */
msgbuf[i++] = 3; /* TPKT version */
msgbuf[i++] = 0; /* TPKT resevred */
/* 1st octet of length, will be populated once len is determined */
- msgbuf[i++] = 0;
+ msgbuf[i++] = 0;
/* 2nd octet of length, will be populated once len is determined */
msgbuf[i++] = 0;
}
-
+
setPERBuffer (pctxt, (unsigned char*) msgbuf+i, (size-i), TRUE);
/* stat = asn1PE_H245MultimediaSystemControlMessage (&gH323ep.msgctxt, */
- stat = asn1PE_H245MultimediaSystemControlMessage (call->msgctxt,
+ stat = asn1PE_H245MultimediaSystemControlMessage (call->msgctxt,
multimediaMsg);
if (stat != ASN_OK) {
- OOTRACEERR3 ("ERROR: H245 Message encoding failed (%s, %s)\n",
+ OOTRACEERR3 ("ERROR: H245 Message encoding failed (%s, %s)\n",
call->callType, call->callToken);
/* OOTRACEERR1 (errGetText (&gH323ep.msgctxt)); */
OOTRACEERR1 (errGetText (call->msgctxt));
return OO_FAILED;
}
-
+
encodePtr = encodeGetMsgPtr(pctxt, &encodeLen);
len +=encodeLen;
msgbuf[3] = (len>>8);
if(iRet != OO_OK)
{
- OOTRACEERR3("Error:Failed to encode H245 message. (%s, %s)\n",
+ OOTRACEERR3("Error:Failed to encode H245 message. (%s, %s)\n",
call->callType, call->callToken);
memFreePtr (call->pctxt, encodebuf);
return OO_FAILED;
}
if(!call->pH245Channel)
{
- call->pH245Channel =
+ call->pH245Channel =
(OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));
if(!call->pH245Channel)
{
}
}
- /* We need to send EndSessionCommand immediately.*/
+ /* We need to send EndSessionCommand immediately.*/
if(!OO_TESTFLAG(call->flags, OO_M_TUNNELING)){
if(encodebuf[0]== OOEndSessionCommand) /* High priority message */
{
}
else{
dListAppend (call->pctxt, &call->pH245Channel->outQueue, encodebuf);
- OOTRACEDBGC4("Queued H245 messages %d. (%s, %s)\n",
- call->pH245Channel->outQueue.count,
- call->callType, call->callToken);
+ OOTRACEDBGC4("Queued H245 messages %d. (%s, %s)\n",
+ call->pH245Channel->outQueue.count,
+ call->callType, call->callToken);
}
}
else{
"progress. (%s, %s)\n", call->callType, call->callToken);
return OO_OK;
}
-
- ret = ooCreateH245Message(call, &ph245msg,
+
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
-
+
if(ret == OO_FAILED)
{
OOTRACEERR3("Error:Failed to create H245 message for Terminal "
call->callType, call->callToken);
return OO_FAILED;
}
-
+
request->t = T_H245RequestMessage_terminalCapabilitySet;
request->u.terminalCapabilitySet = (H245TerminalCapabilitySet*)
- memAlloc(pctxt, sizeof(H245TerminalCapabilitySet));
+ memAlloc(pctxt, sizeof(H245TerminalCapabilitySet));
termCap = request->u.terminalCapabilitySet;
memset(termCap, 0, sizeof(H245TerminalCapabilitySet));
termCap->m.multiplexCapabilityPresent = 0;
termCap->m.capabilityTablePresent = 1;
termCap->m.capabilityDescriptorsPresent = 1;
- termCap->sequenceNumber = ++(call->localTermCapSeqNo);
+ termCap->sequenceNumber = ++(call->localTermCapSeqNo);
termCap->protocolIdentifier = gh245ProtocolID; /* protocol id */
/* Initialize alternate sets */
/* Add audio Capabilities */
-
+
dListInit(&(termCap->capabilityTable));
for(k=0; k<(int)call->capPrefs.index; k++)
{
epCap = call->ourCaps;
else
epCap = gH323ep.myCaps;
- while(epCap) {
- if(epCap->cap == call->capPrefs.order[k])
+ while(epCap) {
+ if(epCap->cap == call->capPrefs.order[k])
break;
epCap = epCap->next;
}
if(epCap->capType == OO_CAP_TYPE_AUDIO)
{
- /* Create audio capability. If capability supports receive, we only
- add it as receive capability in TCS. However, if it supports only
+ /* Create audio capability. If capability supports receive, we only
+ add it as receive capability in TCS. However, if it supports only
transmit, we add it as transmit capability in TCS.
*/
if((epCap->dir & OORX))
if(!audioCap)
{
OOTRACEWARN4("WARN:Failed to create audio capability %s "
- "(%s, %s)\n", ooGetCapTypeText(epCap->cap),
+ "(%s, %s)\n", ooGetCapTypeText(epCap->cap),
call->callType, call->callToken);
continue;
}
"(%s, %s)\n", ooGetCapTypeText(epCap->cap),
call->callType, call->callToken);
continue;
- }
+ }
}
else{
OOTRACEWARN3("Warn:Capability is not RX/TX/RXANDTX. Symmetric "
- "capabilities are not supported.(%s, %s)\n",
+ "capabilities are not supported.(%s, %s)\n",
call->callType, call->callToken);
continue;
}
else if(epCap->capType == OO_CAP_TYPE_DATA)
{
- /* Create t.38 capability. If capability supports receive, we only
- add it as receive capability in TCS. However, if it supports only
+ /* Create t.38 capability. If capability supports receive, we only
+ add it as receive capability in TCS. However, if it supports only
transmit, we add it as transmit capability in TCS.
*/
if((epCap->dir & OORX) && !(epCap->dir & OOTX))
"(%s, %s)\n",
call->callType, call->callToken);
continue;
- }
+ }
}
else{
OOTRACEDBGC3("Sending transmit&recevie capability t38 in TCS.(%s, %s)\n",
"(%s, %s)\n",
call->callType, call->callToken);
continue;
- }
+ }
}
/* Add Capabilities to Capability Table */
entry = (H245CapabilityTableEntry*) memAlloc(pctxt,
"(%s, %s)\n", ooGetCapTypeText(epCap->cap),
call->callType, call->callToken);
continue;
- }
+ }
}
else{
OOTRACEWARN3("Warn:Capability is not RX/TX/RXANDTX. Symmetric "
- "capabilities are not supported.(%s, %s)\n",
+ "capabilities are not supported.(%s, %s)\n",
call->callType, call->callToken);
continue;
}
if(!entry)
{
OOTRACEERR3("Error:Failed to allocate memory for new capability "
- "table entry. (%s, %s)\n", call->callType,
+ "table entry. (%s, %s)\n", call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
memset(entry, 0, sizeof(H245CapabilityTableEntry));
entry->m.capabilityPresent = 1;
entry->capability.t = T_H245Capability_receiveRTPAudioTelephonyEventCapability;
entry->capability.u.receiveRTPAudioTelephonyEventCapability = ateCap;
-
+
entry->capabilityTableEntryNumber = i+1;
dListAppend(pctxt , &(termCap->capabilityTable), entry);
altSetDtmf->elem[altSetDtmf->n] = i+1;
if(!entry)
{
OOTRACEERR3("Error:Failed to allocate memory for new capability "
- "table entry. (%s, %s)\n", call->callType,
+ "table entry. (%s, %s)\n", call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
memset(entry, 0, sizeof(H245CapabilityTableEntry));
entry->m.capabilityPresent = 1;
entry->capability.t = T_H245Capability_receiveDataApplicationCapability;
entry->capability.u.receiveDataApplicationCapability = rtdCap;
-
+
entry->capabilityTableEntryNumber = i+1;
dListAppend(pctxt , &(termCap->capabilityTable), entry);
altSetDtmf->elem[altSetDtmf->n] = i+1;
if(!entry)
{
OOTRACEERR3("Error:Failed to allocate memory for new capability "
- "table entry. (%s, %s)\n", call->callType,
+ "table entry. (%s, %s)\n", call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
memset(entry, 0, sizeof(H245CapabilityTableEntry));
entry->m.capabilityPresent = 1;
entry->capability.t = T_H245Capability_receiveAndTransmitUserInputCapability;
entry->capability.u.receiveAndTransmitUserInputCapability = userInputCap;
-
+
entry->capabilityTableEntryNumber = i+1;
dListAppend(pctxt , &(termCap->capabilityTable), entry);
altSetDtmf->elem[altSetDtmf->n] = i+1;
if(!entry)
{
OOTRACEERR3("Error:Failed to allocate memory for new capability "
- "table entry. (%s, %s)\n", call->callType,
+ "table entry. (%s, %s)\n", call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
memset(entry, 0, sizeof(H245CapabilityTableEntry));
entry->m.capabilityPresent = 1;
entry->capability.t = T_H245Capability_receiveAndTransmitUserInputCapability;
entry->capability.u.receiveAndTransmitUserInputCapability = userInputCap;
-
+
entry->capabilityTableEntryNumber = i+1;
dListAppend(pctxt , &(termCap->capabilityTable), entry);
altSetDtmf->elem[altSetDtmf->n] = i+1;
}
}
-
+
/*TODO:Add Video and Data capabilities, if required*/
if(i==0)
{
ooFreeH245Message(call,ph245msg);
return OO_FAILED;
}
-
+
/* Define capability descriptior */
capDesc = (H245CapabilityDescriptor*)
memAlloc(pctxt, sizeof(H245CapabilityDescriptor));
memset(altSet, 0, sizeof(H245AlternativeCapabilitySet));
altSet->n = 1;
altSet->elem[0] = j+1;
-
+
dListAppend(pctxt, &(capDesc->simultaneousCapabilities), altSet);
} */
dListInit(&(termCap->capabilityDescriptors));
dListAppend(pctxt, &(termCap->capabilityDescriptors), capDesc);
- OOTRACEDBGA3("Built terminal capability set message (%s, %s)\n",
+ OOTRACEDBGA3("Built terminal capability set message (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
statusDeterminationNumber = rand()%16777215;
return statusDeterminationNumber;
}
-/* TODO: Should Send MasterSlave Release when no response from
+/* TODO: Should Send MasterSlave Release when no response from
Remote endpoint after MasterSlaveDetermination sent within
timeout.
*/
-int ooHandleMasterSlave(OOH323CallData *call, void * pmsg,
+int ooHandleMasterSlave(OOH323CallData *call, void * pmsg,
int msgType)
{
H245MasterSlaveDetermination *masterSlave;
case OOMasterSlaveDetermination:
OOTRACEINFO3("Master Slave Determination received (%s, %s)\n",
call->callType, call->callToken);
-
+
masterSlave = (H245MasterSlaveDetermination*)pmsg;
- if(call->masterSlaveState != OO_MasterSlave_DetermineSent &&
+ if(call->masterSlaveState != OO_MasterSlave_DetermineSent &&
OO_TESTFLAG(gH323ep.flags, OO_M_TRYBEMASTER))
{
ooSendMasterSlaveDeterminationAck(call, "slave");
/* Since term types are same, master slave determination will
be done based on statusdetermination number
*/
-
+
OOTRACEDBGA3("Determining master-slave based on StatusDetermination"
"Number (%s, %s)\n", call->callType, call->callToken);
if(call->masterSlaveState == OO_MasterSlave_DetermineSent)
statusDeterminationNumber = call->statusDeterminationNumber;
else
- if (OO_TESTFLAG(gH323ep.flags, OO_M_TRYBEMASTER))
+ if (OO_TESTFLAG(gH323ep.flags, OO_M_TRYBEMASTER))
statusDeterminationNumber = masterSlave->statusDeterminationNumber - 1;
else
statusDeterminationNumber = ooGenerateStatusDeterminationNumber();
moduloDiff = (masterSlave->statusDeterminationNumber - statusDeterminationNumber)
&0xffffff;
-
- /* if(masterSlave->statusDeterminationNumber >
+
+ /* if(masterSlave->statusDeterminationNumber >
statusDeterminationNumber) */
if (moduloDiff < 0x800000 && moduloDiff != 0)
{
call->callType, call->callToken);
return OO_OK;
}
- /* if(masterSlave->statusDeterminationNumber <
+ /* if(masterSlave->statusDeterminationNumber <
statusDeterminationNumber) */
if (moduloDiff > 0x800000)
{
call->callType, call->callToken);
return OO_OK;
}
- /* if(masterSlave->statusDeterminationNumber ==
+ /* if(masterSlave->statusDeterminationNumber ==
statusDeterminationNumber) */
if (moduloDiff == 0 || moduloDiff == 0x800000)
{
masterSlaveAck = (H245MasterSlaveDeterminationAck*)pmsg;
if(call->masterSlaveState == OO_MasterSlave_DetermineSent)
{
- if(masterSlaveAck->decision.t ==
+ if(masterSlaveAck->decision.t ==
T_H245MasterSlaveDeterminationAck_decision_master)
{
ooSendMasterSlaveDeterminationAck(call, "slave");
}
call->msAckStatus = OO_msAck_remoteReceived;
-
+
if(call->localTermCapState == OO_LocalTermCapSetAckRecvd &&
call->remoteTermCapState == OO_RemoteTermCapSetAckSent)
{
OOTRACEWARN3("Warn:Unhandled Master Slave message received - %s - "
"%s\n", call->callType, call->callToken);
}
- return OO_OK;
+ return OO_OK;
}
int ooSendMasterSlaveDetermination(OOH323CallData *call)
request->u.masterSlaveDetermination = (H245MasterSlaveDetermination*)
ASN1MALLOC(pctxt, sizeof(H245MasterSlaveDetermination));
-
+
pMasterSlave = request->u.masterSlaveDetermination;
- memset(pMasterSlave, 0, sizeof(H245MasterSlaveDetermination));
- pMasterSlave->terminalType = gH323ep.termType;
- pMasterSlave->statusDeterminationNumber =
+ memset(pMasterSlave, 0, sizeof(H245MasterSlaveDetermination));
+ pMasterSlave->terminalType = gH323ep.termType;
+ pMasterSlave->statusDeterminationNumber =
ooGenerateStatusDeterminationNumber();
call->statusDeterminationNumber = pMasterSlave->statusDeterminationNumber;
OOTRACEDBGA3("Built MasterSlave Determination (%s, %s)\n", call->callType,
- call->callToken);
+ call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue MasterSlaveDetermination message to"
- " outbound queue. (%s, %s)\n", call->callType,
+ " outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
else
call->masterSlaveState = OO_MasterSlave_DetermineSent;
-
+
ooFreeH245Message(call, ph245msg);
return ret;
/* OOCTXT *pctxt=&gH323ep.msgctxt; */
OOCTXT *pctxt=call->msgctxt;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "
- "Determination Ack (%s, %s)\n",call->callType,
+ "Determination Ack (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
response->t = T_H245ResponseMessage_masterSlaveDeterminationAck;
response->u.masterSlaveDeterminationAck = (H245MasterSlaveDeterminationAck*)
ASN1MALLOC(pctxt, sizeof(H245MasterSlaveDeterminationAck));
- memset(response->u.masterSlaveDeterminationAck, 0,
+ memset(response->u.masterSlaveDeterminationAck, 0,
sizeof(H245MasterSlaveDeterminationAck));
if(!strcmp("master", status))
- response->u.masterSlaveDeterminationAck->decision.t =
+ response->u.masterSlaveDeterminationAck->decision.t =
T_H245MasterSlaveDeterminationAck_decision_master;
else
- response->u.masterSlaveDeterminationAck->decision.t =
+ response->u.masterSlaveDeterminationAck->decision.t =
T_H245MasterSlaveDeterminationAck_decision_slave;
-
- OOTRACEDBGA3("Built MasterSlave determination Ack (%s, %s)\n",
+
+ OOTRACEDBGA3("Built MasterSlave determination Ack (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue MasterSlaveDeterminationAck message"
- " to outbound queue. (%s, %s)\n", call->callType,
+ " to outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message(call, ph245msg);
call->msAckStatus = OO_msAck_localSent;
return ret;
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "
- "Determination Reject (%s, %s)\n",call->callType,
+ "Determination Reject (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
response->t = T_H245ResponseMessage_masterSlaveDeterminationReject;
- response->u.masterSlaveDeterminationReject =
+ response->u.masterSlaveDeterminationReject =
(H245MasterSlaveDeterminationReject*)
memAlloc (pctxt, sizeof(H245MasterSlaveDeterminationReject));
response->u.masterSlaveDeterminationReject->cause.t =
T_H245MasterSlaveDeterminationReject_cause_identicalNumbers;
- OOTRACEDBGA3 ("Built MasterSlave determination reject (%s, %s)\n",
+ OOTRACEDBGA3 ("Built MasterSlave determination reject (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue MasterSlaveDeterminationReject "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - MasterSlave "
- "Determination Release (%s, %s)\n",call->callType,
+ "Determination Release (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
indication->t = T_H245IndicationMessage_masterSlaveDeterminationRelease;
- indication->u.masterSlaveDeterminationRelease =
+ indication->u.masterSlaveDeterminationRelease =
(H245MasterSlaveDeterminationRelease*)
memAlloc (pctxt, sizeof(H245MasterSlaveDeterminationRelease));
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
- OOTRACEDBGA3 ("Built MasterSlave determination Release (%s, %s)\n",
+ OOTRACEDBGA3 ("Built MasterSlave determination Release (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue MasterSlaveDeterminationRelease "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
}
if(call->msdRetries < DEFAULT_MAX_RETRIES)
{
call->msdRetries++;
- OOTRACEDBGA3("Retrying MasterSlaveDetermination. (%s, %s)\n",
+ OOTRACEDBGA3("Retrying MasterSlaveDetermination. (%s, %s)\n",
call->callType, call->callToken);
call->masterSlaveState = OO_MasterSlave_Idle;
ooSendMasterSlaveDetermination(call);
H245Message *ph245msg=NULL;
OOCTXT *pctxt=call->msgctxt;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
OOTRACEERR3("Error:H245 message creation failed for - RequestMode "
- "Ack (%s, %s)\n",call->callType,
+ "Ack (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
response->t = T_H245ResponseMessage_requestModeAck;
response->u.requestModeAck = (H245RequestModeAck *)
ASN1MALLOC(pctxt, sizeof(H245RequestModeAck));
- memset(response->u.requestModeAck, 0,
+ memset(response->u.requestModeAck, 0,
sizeof(H245RequestModeAck));
response->u.requestModeAck->sequenceNumber = sequenceNumber;
- response->u.requestModeAck->response.t =
+ response->u.requestModeAck->response.t =
T_H245RequestModeAck_response_willTransmitMostPreferredMode;
- OOTRACEDBGA3("Built RequestModeAck (%s, %s)\n",
+ OOTRACEDBGA3("Built RequestModeAck (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue RequestModeAck message"
- " to outbound queue. (%s, %s)\n", call->callType,
+ " to outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message(call, ph245msg);
return ret;
}
H245Message *ph245msg=NULL;
OOCTXT *pctxt=call->msgctxt;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
OOTRACEERR3("Error:H245 message creation failed for - RequstMode "
- "Reject (%s, %s)\n",call->callType,
+ "Reject (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
response->t = T_H245ResponseMessage_requestModeReject;
response->u.requestModeReject = (H245RequestModeReject *)
ASN1MALLOC(pctxt, sizeof(H245RequestModeReject));
- memset(response->u.requestModeReject, 0,
+ memset(response->u.requestModeReject, 0,
sizeof(H245RequestModeReject));
response->u.requestModeReject->sequenceNumber = sequenceNumber;
- response->u.requestModeReject->cause.t =
+ response->u.requestModeReject->cause.t =
T_H245RequestModeReject_cause_modeUnavailable;
- OOTRACEDBGA3("Built RequestModeReject (%s, %s)\n",
+ OOTRACEDBGA3("Built RequestModeReject (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue RequestModeReject message"
- " to outbound queue. (%s, %s)\n", call->callType,
+ " to outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message(call, ph245msg);
return ret;
}
if (isT38Mode && !OO_TESTFLAG(call->flags, OO_M_T38SUPPORTED)) /* t38 req but we dont support */
return OO_OK;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
if(ret != OO_OK)
{
OOTRACEERR3("Error:H245 message creation failed for - RequstMode "
- "(%s, %s)\n",call->callType,
+ "(%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
request->u.requestMode = (H245RequestMode *)
ASN1MALLOC(pctxt, sizeof(H245RequestMode));
- memset(request->u.requestMode, 0,
+ memset(request->u.requestMode, 0,
sizeof(H245RequestMode));
call->requestSequence++;
pModeElem.type.u.dataMode->bitRate = 144;
if (!ooCreateT38ApplicationData(pctxt,&(pModeElem.type.u.dataMode->application))) {
OOTRACEERR3("Error:Memory - ooCapabilityCreateT38Capability - (%s, %s)\n",
- call->callType,
+ call->callType,
call->callToken);
}
} else {
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue RequestMode message"
- " to outbound queue. (%s, %s)\n", call->callType,
+ " to outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message(call, ph245msg);
return ret;
}
int ooHandleRequestMode(OOH323CallData* call,
H245RequestMode *requestMode)
{
-
+
H245ModeDescription** pModeRef;
H245ModeElement** pModeElem;
H245ModeElementType* pMode;
pMode = &((*pModeElem)->type);
OOTRACEDBGA5("Handle RequestMode: "
" modetype: %d/%d for (%s, %s)\n", pMode->t, pMode->u.dataMode->application.t,
- call->callType,
+ call->callType,
call->callToken);
switch (pMode->t) {
case T_H245ModeElementType_dataMode:
}
break;
case T_H245ModeElementType_audioMode:
- if (ooSendRequestModeAck(call, requestMode->sequenceNumber) == OO_OK &&
+ if (ooSendRequestModeAck(call, requestMode->sequenceNumber) == OO_OK &&
OO_TESTFLAG(call->flags, OO_M_DATASESSION)) {
OO_CLRFLAG(call->flags, OO_M_DATASESSION);
;
}
return OO_OK;
-
+
}
-int ooHandleOpenLogicalChannel(OOH323CallData* call,
+int ooHandleOpenLogicalChannel(OOH323CallData* call,
H245OpenLogicalChannel *olc)
{
H245OpenLogicalChannel_forwardLogicalChannelParameters *flcp =
&(olc->forwardLogicalChannelParameters);
-
+
#if 0
if(!call->logicalChans)
ooOpenLogicalChannels(call);
#endif
- /* Check whether channel type is supported. Only supported channel
+ /* Check whether channel type is supported. Only supported channel
type for now is g711ulaw audio channel.
*/
switch(flcp->dataType.t)
T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported);
break;
default:
- OOTRACEERR3("ERROR:Unknown media channel data type (%s, %s)\n",
+ OOTRACEERR3("ERROR:Unknown media channel data type (%s, %s)\n",
call->callType, call->callToken);
ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber,
T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported);
}
-
+
return OO_OK;
-}
+}
/*TODO: Need to clean logical channel in case of failure after creating one */
-int ooHandleOpenLogicalChannel_helper(OOH323CallData *call,
+int ooHandleOpenLogicalChannel_helper(OOH323CallData *call,
H245OpenLogicalChannel*olc)
{
int ret=0;
if(!flcp || flcp->multiplexParameters.t != T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR3("Error:ooHandleOpenLogicalChannel_helper - invalid forward "
- "logical channel parameters. (%s, %s)\n", call->callType,
+ "logical channel parameters. (%s, %s)\n", call->callType,
call->callToken);
ooSendOpenLogicalChannelReject(call, olc->forwardLogicalChannelNumber,
T_H245OpenLogicalChannelReject_cause_unspecified);
if(ret != OO_OK)
{
OOTRACEERR3("Error: H245 message creation failed for - "
- "OpenLogicalChannel Ack (%s, %s)\n", call->callType,
+ "OpenLogicalChannel Ack (%s, %s)\n", call->callType,
call->callToken);
memFreePtr(call->pctxt, epCap);
epCap = NULL;
memset(response, 0, sizeof(H245ResponseMessage));
response->t = T_H245ResponseMessage_openLogicalChannelAck;
response->u.openLogicalChannelAck = (H245OpenLogicalChannelAck*)
- memAlloc(pctxt, sizeof(H245OpenLogicalChannelAck));
+ memAlloc(pctxt, sizeof(H245OpenLogicalChannelAck));
olcAck = response->u.openLogicalChannelAck;
memset(olcAck, 0, sizeof(H245OpenLogicalChannelAck));
olcAck->forwardLogicalChannelNumber = olc->forwardLogicalChannelNumber;
olcAck->m.forwardMultiplexAckParametersPresent = 1;
- olcAck->forwardMultiplexAckParameters.t =
+ olcAck->forwardMultiplexAckParameters.t =
T_H245OpenLogicalChannelAck_forwardMultiplexAckParameters_h2250LogicalChannelAckParameters;
- olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters =
- (H245H2250LogicalChannelAckParameters*)ASN1MALLOC(pctxt,
+ olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters =
+ (H245H2250LogicalChannelAckParameters*)ASN1MALLOC(pctxt,
sizeof(H245H2250LogicalChannelAckParameters));
- h2250lcap =
+ h2250lcap =
olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters;
memset(h2250lcap, 0, sizeof(H245H2250LogicalChannelAckParameters));
h2250lcap->sessionID = ooCallGenerateSessionID(call, epCap->capType, "receive");
else
h2250lcap->sessionID = h2250lcp->sessionID;
-
- h2250lcap->mediaChannel.t =
+
+ h2250lcap->mediaChannel.t =
T_H245TransportAddress_unicastAddress;
h2250lcap->mediaChannel.u.unicastAddress = (H245UnicastAddress*)
ASN1MALLOC(pctxt, sizeof(H245UnicastAddress));
memset(iPAddress, 0, sizeof(H245UnicastAddress_iPAddress));
}
- pLogicalChannel = ooAddNewLogicalChannel(call,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
olc->forwardLogicalChannelNumber, h2250lcap->sessionID,
"receive", epCap);
if(!pLogicalChannel)
{
- OOTRACEERR3("ERROR:Failed to add new logical channel entry to call "
+ OOTRACEERR3("ERROR:Failed to add new logical channel entry to call "
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
}
/* media contrcol channel */
- h2250lcap->mediaControlChannel.t =
+ h2250lcap->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
h2250lcap->mediaControlChannel.u.unicastAddress = (H245UnicastAddress*)
ASN1MALLOC(pctxt, sizeof(H245UnicastAddress));
iPAddress1->tsapIdentifier = pLogicalChannel->localRtcpPort;
}
- OOTRACEDBGA3("Built OpenLogicalChannelAck (%s, %s)\n", call->callType,
+ OOTRACEDBGA3("Built OpenLogicalChannelAck (%s, %s)\n", call->callType,
call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to enqueue OpenLogicalChannelAck message to "
- "outbound queue. (%s, %s)\n", call->callType,
+ "outbound queue. (%s, %s)\n", call->callType,
call->callToken);
}
ooFreeH245Message(call, ph245msg);
if(epCap->startReceiveChannel)
{
- epCap->startReceiveChannel(call, pLogicalChannel);
- OOTRACEINFO6("Receive channel of type %s started at %s:%d(%s, %s)\n",
+ epCap->startReceiveChannel(call, pLogicalChannel);
+ OOTRACEINFO6("Receive channel of type %s started at %s:%d(%s, %s)\n",
ooGetCapTypeText(epCap->cap), pLogicalChannel->localIP,
- pLogicalChannel->localRtpPort, call->callType,
+ pLogicalChannel->localRtpPort, call->callType,
call->callToken);
}
else{
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - OpenLogicalChannel"
- "Reject (%s, %s)\n",call->callType,
+ "Reject (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
response->t = T_H245ResponseMessage_openLogicalChannelReject;
- response->u.openLogicalChannelReject =
+ response->u.openLogicalChannelReject =
(H245OpenLogicalChannelReject*)
memAlloc (pctxt, sizeof(H245OpenLogicalChannelReject));
if(!response->u.openLogicalChannelReject)
{
OOTRACEERR3("Error: Failed to allocate memory for OpenLogicalChannel"
- "Reject message. (%s, %s)\n", call->callType,
+ "Reject message. (%s, %s)\n", call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
- response->u.openLogicalChannelReject->forwardLogicalChannelNumber =
+ response->u.openLogicalChannelReject->forwardLogicalChannelNumber =
channelNum;
response->u.openLogicalChannelReject->cause.t = cause;
- OOTRACEDBGA3 ("Built OpenLogicalChannelReject (%s, %s)\n",
+ OOTRACEDBGA3 ("Built OpenLogicalChannelReject (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue OpenLogicalChannelReject "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
H245UnicastAddress_iP6Address *iP6Address1 = NULL;
if(!((olcAck->m.forwardMultiplexAckParametersPresent == 1) &&
- (olcAck->forwardMultiplexAckParameters.t ==
+ (olcAck->forwardMultiplexAckParameters.t ==
T_H245OpenLogicalChannelAck_forwardMultiplexAckParameters_h2250LogicalChannelAckParameters)))
{
OOTRACEERR3("Error: Processing open logical channel ack - LogicalChannel"
- "Ack parameters absent (%s, %s)\n", call->callType,
+ "Ack parameters absent (%s, %s)\n", call->callType,
call->callToken);
return OO_OK; /* should send CloseLogicalChannel request */
}
- h2250lcap =
+ h2250lcap =
olcAck->forwardMultiplexAckParameters.u.h2250LogicalChannelAckParameters;
/* Extract media channel address */
if(h2250lcap->m.mediaChannelPresent != 1)
- {
+ {
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel "
"absent (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
if(h2250lcap->mediaChannel.t != T_H245TransportAddress_unicastAddress)
{
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel "
- "address type is not unicast (%s, %s)\n", call->callType,
+ "address type is not unicast (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
-
+
unicastAddr = h2250lcap->mediaChannel.u.unicastAddress;
if (call->versionIP == 6) {
if(unicastAddr->t != T_H245UnicastAddress_iP6Address)
{
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel "
- "address type is not IP6 (%s, %s)\n", call->callType,
+ "address type is not IP6 (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
iP6Address = unicastAddr->u.iP6Address;
inet_ntop(AF_INET6, iP6Address->network.data, remoteip, sizeof(remoteip));
-
+
} else {
if(unicastAddr->t != T_H245UnicastAddress_iPAddress)
{
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media channel "
- "address type is not IP (%s, %s)\n", call->callType,
+ "address type is not IP (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
iPAddress = unicastAddr->u.iPAddress;
inet_ntop(AF_INET, iPAddress->network.data, remoteip, sizeof(remoteip));
}
-
+
/* Extract media control channel address */
if(h2250lcap->m.mediaControlChannelPresent == 1) {
- if(h2250lcap->mediaControlChannel.t !=
+ if(h2250lcap->mediaControlChannel.t !=
T_H245TransportAddress_unicastAddress)
{
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control "
- "channel address type is not unicast (%s, %s)\n",
+ "channel address type is not unicast (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
-
+
unicastAddr1 = h2250lcap->mediaControlChannel.u.unicastAddress;
if (call->versionIP == 6) {
if(unicastAddr1->t != T_H245UnicastAddress_iP6Address) {
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control "
- "channel address type is not IP6 (%s, %s)\n", call->callType,
+ "channel address type is not IP6 (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
} else {
if(unicastAddr1->t != T_H245UnicastAddress_iPAddress) {
OOTRACEERR3("Error: Processing OpenLogicalChannelAck - media control "
- "channel address type is not IP (%s, %s)\n", call->callType,
+ "channel address type is not IP (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
/* Set remote destination address for rtp session */
// strcpy(call->remoteIP, remoteip);
-
+
/* Start channel here */
pLogicalChannel = ooFindLogicalChannelByLogicalChannelNo(call,olcAck->forwardLogicalChannelNumber);
if(!pLogicalChannel)
{
OOTRACEERR4("ERROR:Logical channel %d not found in the channel list for "
- "call (%s, %s)\n", olcAck->forwardLogicalChannelNumber,
+ "call (%s, %s)\n", olcAck->forwardLogicalChannelNumber,
call->callType, call->callToken);
return OO_FAILED;
}
- /* Update session id if we were waiting for remote to assign one and remote
+ /* Update session id if we were waiting for remote to assign one and remote
did assign one. */
if(pLogicalChannel->sessionID == 0 && h2250lcap->m.sessionIDPresent)
- pLogicalChannel->sessionID = h2250lcap->sessionID;
+ pLogicalChannel->sessionID = h2250lcap->sessionID;
/* Populate ports &ip for channel */
}
}
- strcpy(pLogicalChannel->remoteIP, remoteip);
+ strcpy(pLogicalChannel->remoteIP, remoteip);
if (call->versionIP == 6) {
pLogicalChannel->remoteMediaPort = iP6Address->tsapIdentifier;
if (iP6Address1)
if(pLogicalChannel->chanCap->startTransmitChannel)
{
pLogicalChannel->chanCap->startTransmitChannel(call, pLogicalChannel);
- OOTRACEINFO4("TransmitLogical Channel of type %s started (%s, %s)\n",
+ OOTRACEINFO4("TransmitLogical Channel of type %s started (%s, %s)\n",
ooGetCapTypeText(pLogicalChannel->chanCap->cap),
call->callType, call->callToken);
}
return OO_OK;
}
-int ooOnReceivedOpenLogicalChannelRejected(OOH323CallData *call,
+int ooOnReceivedOpenLogicalChannelRejected(OOH323CallData *call,
H245OpenLogicalChannelReject *olcReject)
{
switch(olcReject->cause.t)
{
case T_H245OpenLogicalChannelReject_cause_unspecified:
OOTRACEINFO4("Open logical channel %d rejected - unspecified (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber, call->callType,
+ olcReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_unsuitableReverseParameters:
OOTRACEINFO4("Open logical channel %d rejected - "
- "unsuitableReverseParameters (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber, call->callType,
+ "unsuitableReverseParameters (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_dataTypeNotSupported:
OOTRACEINFO4("Open logical channel %d rejected - dataTypeNotSupported"
- "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
+ "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_dataTypeNotAvailable:
OOTRACEINFO4("Open logical channel %d rejected - dataTypeNotAvailable"
- "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
+ "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_unknownDataType:
OOTRACEINFO4("Open logical channel %d rejected - unknownDataType"
- "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
+ "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_dataTypeALCombinationNotSupported:
OOTRACEINFO4("Open logical channel %d rejected - "
- "dataTypeALCombinationNotSupported(%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "dataTypeALCombinationNotSupported(%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_multicastChannelNotAllowed:
OOTRACEINFO4("Open logical channel %d rejected - "
- "multicastChannelNotAllowed (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "multicastChannelNotAllowed (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_insufficientBandwidth:
OOTRACEINFO4("Open logical channel %d rejected - insufficientBandwidth"
- "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
+ "(%s, %s)\n", olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_separateStackEstablishmentFailed:
OOTRACEINFO4("Open logical channel %d rejected - "
- "separateStackEstablishmentFailed (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "separateStackEstablishmentFailed (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_invalidSessionID:
OOTRACEINFO4("Open logical channel %d rejected - "
- "invalidSessionID (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "invalidSessionID (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_masterSlaveConflict:
OOTRACEINFO4("Open logical channel %d rejected - "
- "invalidSessionID (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "invalidSessionID (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_waitForCommunicationMode:
OOTRACEINFO4("Open logical channel %d rejected - "
- "waitForCommunicationMode (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "waitForCommunicationMode (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_invalidDependentChannel:
OOTRACEINFO4("Open logical channel %d rejected - "
- "invalidDependentChannel (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "invalidDependentChannel (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
case T_H245OpenLogicalChannelReject_cause_replacementForRejected:
OOTRACEINFO4("Open logical channel %d rejected - "
- "replacementForRejected (%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ "replacementForRejected (%s, %s)\n",
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
break;
default:
OOTRACEERR4("Error: OpenLogicalChannel %d rejected - "
"invalid cause(%s, %s)\n",
- olcReject->forwardLogicalChannelNumber,
+ olcReject->forwardLogicalChannelNumber,
call->callType, call->callToken);
}
if(call->callState < OO_CALL_CLEAR)
H245CommandMessage * command;
OOCTXT *pctxt;
H245Message *ph245msg=NULL;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_command);
if(ret != OO_OK)
{
}
-int ooHandleH245Command(OOH323CallData *call,
+int ooHandleH245Command(OOH323CallData *call,
H245CommandMessage *command)
{
ASN1UINT i;
switch(command->t)
{
case T_H245CommandMessage_endSessionCommand:
- OOTRACEINFO3("Received EndSession command (%s, %s)\n",
+ OOTRACEINFO3("Received EndSession command (%s, %s)\n",
call->callType, call->callToken);
if(call->h245SessionState == OO_H245SESSION_ENDSENT)
{
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if(((ooTimerCallback*)pTimer->cbData)->timerType &
+ if(((ooTimerCallback*)pTimer->cbData)->timerType &
OO_SESSION_TIMER)
{
ASN1MEMFREEPTR(call->pctxt, pTimer->cbData);
ooTimerDelete(call->pctxt, &call->timerList, pTimer);
- OOTRACEDBGC3("Deleted Session Timer. (%s, %s)\n",
+ OOTRACEDBGC3("Deleted Session Timer. (%s, %s)\n",
call->callType, call->callToken);
break;
}
if(call->logicalChans)
{
OOTRACEINFO3("In response to received EndSessionCommand - "
- "Clearing all logical channels. (%s, %s)\n",
+ "Clearing all logical channels. (%s, %s)\n",
call->callType, call->callToken);
ooClearAllLogicalChannels(call);
}
if (call->callState < OO_CALL_CLEAR)
call->callState = OO_CALL_CLEAR;
}
-
-
+
+
break;
case T_H245CommandMessage_sendTerminalCapabilitySet:
OOTRACEWARN3("Warning: Received command Send terminal capability set "
- "- Not handled (%s, %s)\n", call->callType,
+ "- Not handled (%s, %s)\n", call->callType,
call->callToken);
break;
case T_H245CommandMessage_flowControlCommand:
OOTRACEWARN3("Warning: Unhandled H245 command message received "
"(%s, %s)\n", call->callType, call->callToken);
}
- OOTRACEDBGC3("Handling H.245 command message done. (%s, %s)\n",
- call->callType, call->callToken);
+ OOTRACEDBGC3("Handling H.245 command message done. (%s, %s)\n",
+ call->callType, call->callToken);
return OO_OK;
}
call->localTermCapState = OO_LocalTermCapSetAckRecvd;
if(call->remoteTermCapState != OO_RemoteTermCapSetAckSent)
return OO_OK;
-
+
if(call->masterSlaveState == OO_MasterSlave_Idle) {
ret = ooSendMasterSlaveDetermination(call);
if(ret != OO_OK) {
"(%s, %s)\n", call->callType, call->callToken);
return ret;
}
- }
+ }
if((call->masterSlaveState == OO_MasterSlave_Master ||
call->masterSlaveState == OO_MasterSlave_Slave) &&
gH323ep.h323Callbacks.openLogicalChannels(call);
/* ooSendStatusInquiry(call); */
-
+
if(!ooGetTransmitLogicalChannel(call))
ooOpenLogicalChannels(call);
#if 0
}
#endif
}
-
+
return OO_OK;
}
temp = call->logicalChans;
while(temp)
{
- if(temp->state == OO_LOGICALCHAN_ESTABLISHED &&
+ if(temp->state == OO_LOGICALCHAN_ESTABLISHED &&
(dir == NULL || !strcmp(temp->dir,dir)))
{
/* Sending closelogicalchannel only for outgoing channels*/
OOCTXT *pctxt;
H245RequestMessage *request;
H245CloseLogicalChannel* clc;
-
- ret = ooCreateH245Message(call, &ph245msg,
+
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
if(ret != OO_OK)
{
clc->m.reasonPresent = 1;
clc->reason.t = T_H245CloseLogicalChannel_reason_unknown;
- OOTRACEDBGA4("Built close logical channel for %d (%s, %s)\n",
+ OOTRACEDBGA4("Built close logical channel for %d (%s, %s)\n",
logicalChan->channelNo, call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
error++;
}
ooFreeH245Message(call, ph245msg);
-
+
/* Stop the media transmission */
/* Moved to OnReceivedClosedChannelAck */
logicalChan->state = OO_LOGICALCHAN_CLOSEPENDING;
}
/*TODO: Need to pass reason as a parameter */
-int ooSendRequestCloseLogicalChannel(OOH323CallData *call,
+int ooSendRequestCloseLogicalChannel(OOH323CallData *call,
ooLogicalChannel *logicalChan)
{
int ret = OO_OK;
H245RequestMessage *request;
H245RequestChannelClose *rclc;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
if(ret != OO_OK)
{
OOTRACEERR3("ERROR:Failed to create H245 message for "
- "requestCloseLogicalChannel message (%s, %s)\n",
+ "requestCloseLogicalChannel message (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
rclc = request->u.requestChannelClose;
memset(rclc, 0, sizeof(H245RequestChannelClose));
rclc->forwardLogicalChannelNumber = logicalChan->channelNo;
-
+
rclc->m.reasonPresent = 1;
rclc->reason.t = T_H245RequestChannelClose_reason_unknown;
- OOTRACEDBGA4("Built RequestCloseChannel for %d (%s, %s)\n",
+ OOTRACEDBGA4("Built RequestCloseChannel for %d (%s, %s)\n",
logicalChan->channelNo, call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
OOCTXT *pctxt;
H245IndicationMessage *indication;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_indication);
if(ret != OO_OK)
{
OOTRACEERR3("ERROR:Failed to create H245 message for "
- "RequestChannelCloseRelease message (%s, %s)\n",
+ "RequestChannelCloseRelease message (%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
if(!indication->u.requestChannelCloseRelease)
{
OOTRACEERR3("Error:Failed to allocate memory for "
- "RequestChannelCloseRelease message. (%s, %s)\n",
+ "RequestChannelCloseRelease message. (%s, %s)\n",
call->callType, call->callToken);
ooFreeH245Message(call, ph245msg);
}
- indication->u.requestChannelCloseRelease->forwardLogicalChannelNumber =
+ indication->u.requestChannelCloseRelease->forwardLogicalChannelNumber =
channelNum;
- OOTRACEDBGA4("Built RequestChannelCloseRelease for %d (%s, %s)\n",
+ OOTRACEDBGA4("Built RequestChannelCloseRelease for %d (%s, %s)\n",
channelNum, call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
}
-
-int ooOnReceivedRequestChannelClose(OOH323CallData *call,
+
+int ooOnReceivedRequestChannelClose(OOH323CallData *call,
H245RequestChannelClose *rclc)
{
int ret=0, error=0;
ooLogicalChannel * lChannel=NULL;
/* Send Ack: TODO: Need to send reject, if doesn't exist
*/
- lChannel = ooFindLogicalChannelByLogicalChannelNo(call,
+ lChannel = ooFindLogicalChannelByLogicalChannelNo(call,
rclc->forwardLogicalChannelNumber);
if(!lChannel)
{
return OO_FAILED;
}
}
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
memset(rclcAck, 0, sizeof(H245RequestChannelCloseAck));
rclcAck->forwardLogicalChannelNumber = rclc->forwardLogicalChannelNumber;
- OOTRACEDBGA3("Built RequestCloseChannelAck message (%s, %s)\n",
+ OOTRACEDBGA3("Built RequestCloseChannelAck message (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
}
ooFreeH245Message(call, ph245msg);
-
+
/* Send Close Logical Channel if LogChan is established */
if (lChannel->state == OO_LOGICALCHAN_ESTABLISHED) {
ret = ooSendCloseLogicalChannel(call, lChannel);
}
return OO_FAILED;
}
-
- ret = ooCreateH245Message(call, &ph245msg,
+
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
if(ret != OO_OK)
{
memset(rtdr, 0, sizeof(H245RoundTripDelayRequest));
rtdr->sequenceNumber = ++call->rtdrSend;
- OOTRACEDBGA3("Built RoundTripDelayRequest message (%s, %s)\n",
+ OOTRACEDBGA3("Built RoundTripDelayRequest message (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
return ret;
}
-int ooOnReceivedRoundTripDelayRequest(OOH323CallData *call,
+int ooOnReceivedRoundTripDelayRequest(OOH323CallData *call,
H245SequenceNumber sequenceNumber)
{
int ret=0;
OOCTXT *pctxt=NULL;
H245RoundTripDelayResponse *rtdr;
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
memset(rtdr, 0, sizeof(H245RoundTripDelayResponse));
rtdr->sequenceNumber = sequenceNumber;
- OOTRACEDBGA3("Built RoundTripDelayResponse message (%s, %s)\n",
+ OOTRACEDBGA3("Built RoundTripDelayResponse message (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
}
ooFreeH245Message(call, ph245msg);
-
+
return ret;
}
/*
- We clear channel here. Ideally the remote endpoint should send
+ We clear channel here. Ideally the remote endpoint should send
CloseLogicalChannel and then the channel should be cleared. But there's no
timer for this and if remote endpoint misbehaves, the call will keep waiting
for CloseLogicalChannel and hence, wouldn't be cleared. In case when remote
endpoint sends CloseLogicalChannel, we call ooClearLogicalChannel again,
which simply returns OO_OK as channel was already cleared. Other option is
- to start a timer for call cleanup and if call is not cleaned up within
- timeout, we clean call forcefully. Note, no such timer is defined in
+ to start a timer for call cleanup and if call is not cleaned up within
+ timeout, we clean call forcefully. Note, no such timer is defined in
standards.
*/
int ooOnReceivedRequestChannelCloseAck
ret = ooClearLogicalChannel(call, rccAck->forwardLogicalChannelNumber);
if(ret != OO_OK)
{
- OOTRACEERR4("Error:Failed to clear logical channel %d. (%s, %s)\n",
- rccAck->forwardLogicalChannelNumber, call->callType,
+ OOTRACEERR4("Error:Failed to clear logical channel %d. (%s, %s)\n",
+ rccAck->forwardLogicalChannelNumber, call->callType,
call->callToken);
}
{
case T_H245RequestChannelCloseReject_cause_unspecified:
OOTRACEDBGA4("Remote endpoint has rejected request to close logical "
- "channel %d - cause unspecified. (%s, %s)\n",
- rccReject->forwardLogicalChannelNumber, call->callType,
+ "channel %d - cause unspecified. (%s, %s)\n",
+ rccReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
break;
case T_H245RequestChannelCloseReject_cause_extElem1:
OOTRACEDBGA4("Remote endpoint has rejected request to close logical "
- "channel %d - cause propriatory. (%s, %s)\n",
- rccReject->forwardLogicalChannelNumber, call->callType,
- call->callToken);
+ "channel %d - cause propriatory. (%s, %s)\n",
+ rccReject->forwardLogicalChannelNumber, call->callType,
+ call->callToken);
break;
default:
OOTRACEDBGA4("Remote endpoint has rejected request to close logical "
- "channel %d - cause INVALID. (%s, %s)\n",
- rccReject->forwardLogicalChannelNumber, call->callType,
+ "channel %d - cause INVALID. (%s, %s)\n",
+ rccReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
}
- OOTRACEDBGA4("Clearing logical channel %d. (%s, %s)\n",
- rccReject->forwardLogicalChannelNumber, call->callType,
+ OOTRACEDBGA4("Clearing logical channel %d. (%s, %s)\n",
+ rccReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
ret = ooClearLogicalChannel(call, rccReject->forwardLogicalChannelNumber);
if(ret != OO_OK)
{
- OOTRACEERR4("Error: failed to clear logical channel %d.(%s, %s)\n",
- rccReject->forwardLogicalChannelNumber, call->callType,
+ OOTRACEERR4("Error: failed to clear logical channel %d.(%s, %s)\n",
+ rccReject->forwardLogicalChannelNumber, call->callType,
call->callToken);
}
return ret;
}
/****/
-int ooOnReceivedCloseLogicalChannel(OOH323CallData *call,
+int ooOnReceivedCloseLogicalChannel(OOH323CallData *call,
H245CloseLogicalChannel* clc)
{
int ret=0;
OOCTXT *pctxt = NULL;
H245CloseLogicalChannelAck * clcAck;
H245ResponseMessage *response;
-
+
OOTRACEINFO4("Closing logical channel number %d (%s, %s)\n",
clc->forwardLogicalChannelNumber, call->callType, call->callToken);
-
+
ret = ooClearLogicalChannel(call, clc->forwardLogicalChannelNumber);
if (ret != OO_OK) {
OOTRACEERR4("ERROR:Failed to close logical channel %d (%s, %s)\n",
return OO_FAILED;
}
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
OOTRACEERR3("ERROR:Failed to create H245 message for "
- "closeLogicalChannelAck (%s, %s)\n", call->callType,
+ "closeLogicalChannelAck (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
return ret;
}
-int ooOnReceivedCloseChannelAck(OOH323CallData* call,
+int ooOnReceivedCloseChannelAck(OOH323CallData* call,
H245CloseLogicalChannelAck* clcAck)
{
int ret = OO_OK;
OOTimer *pTimer = NULL;
H245Message *pH245 = (H245Message*)pmsg;
/* There are four major types of H.245 messages that can be received.
- Request/Response/Command/Indication. Each one of them need to be
+ Request/Response/Command/Indication. Each one of them need to be
handled separately.
- */
+ */
H245RequestMessage *request = NULL;
H245ResponseMessage *response = NULL;
H245CommandMessage *command = NULL;
H245IndicationMessage *indication = NULL;
-
- OOTRACEDBGC3("Handling H245 message. (%s, %s)\n", call->callType,
+
+ OOTRACEDBGC3("Handling H245 message. (%s, %s)\n", call->callType,
call->callToken);
-
+
switch(pH245->h245Msg.t)
{
/* H.245 Request message is received */
switch(request->t)
{
case T_H245RequestMessage_terminalCapabilitySet:
- /* If session isn't marked active yet, do it. possible in case of
+ /* If session isn't marked active yet, do it. possible in case of
tunneling */
if(call->h245SessionState == OO_H245SESSION_IDLE)
- call->h245SessionState = OO_H245SESSION_ACTIVE;
+ call->h245SessionState = OO_H245SESSION_ACTIVE;
ooOnReceivedTerminalCapabilitySet(call, pH245);
if(call->localTermCapState == OO_LocalTermCapExchange_Idle)
ooSendTermCapMsg(call);
break;
case T_H245RequestMessage_masterSlaveDetermination:
- ooHandleMasterSlave(call,
- request->u.masterSlaveDetermination,
+ ooHandleMasterSlave(call,
+ request->u.masterSlaveDetermination,
OOMasterSlaveDetermination);
break;
case T_H245RequestMessage_openLogicalChannel:
- ooHandleOpenLogicalChannel(call,
+ ooHandleOpenLogicalChannel(call,
request->u.openLogicalChannel);
if(!ooGetTransmitLogicalChannel(call))
ooOpenLogicalChannels(call);
case T_H245RequestMessage_requestMode:
OOTRACEINFO4("Received request mode - %d (%s, %s)\n",
request->u.requestMode->sequenceNumber, call->callType, call->callToken);
- ooHandleRequestMode(call,
+ ooHandleRequestMode(call,
request->u.requestMode);
break;
case T_H245RequestMessage_closeLogicalChannel:
OOTRACEINFO4("Received close logical Channel - %d (%s, %s)\n",
- request->u.closeLogicalChannel->forwardLogicalChannelNumber,
+ request->u.closeLogicalChannel->forwardLogicalChannelNumber,
call->callType, call->callToken);
- if (ooOnReceivedCloseLogicalChannel(call,
+ if (ooOnReceivedCloseLogicalChannel(call,
request->u.closeLogicalChannel) == OO_OK) {
if (call->TCSPending && !ooGetTransmitLogicalChannel(call)) {
call->TCSPending = FALSE;
break;
case T_H245RequestMessage_requestChannelClose:
OOTRACEINFO4("Received RequestChannelClose - %d (%s, %s)\n",
- request->u.requestChannelClose->forwardLogicalChannelNumber,
+ request->u.requestChannelClose->forwardLogicalChannelNumber,
call->callType, call->callToken);
- ooOnReceivedRequestChannelClose(call,
+ ooOnReceivedRequestChannelClose(call,
request->u.requestChannelClose);
break;
case T_H245RequestMessage_roundTripDelayRequest:
;
} /* End of Request Message */
break;
- /* H.245 Response message is received */
+ /* H.245 Response message is received */
case (T_H245MultimediaSystemControlMessage_response):
response = pH245->h245Msg.u.response;
switch(response->t)
}
}
- ooHandleMasterSlave(call,
- response->u.masterSlaveDeterminationAck,
+ ooHandleMasterSlave(call,
+ response->u.masterSlaveDeterminationAck,
OOMasterSlaveAck);
break;
case T_H245ResponseMessage_masterSlaveDeterminationReject:
break;
}
}
- ooHandleMasterSlaveReject(call,
+ ooHandleMasterSlaveReject(call,
response->u.masterSlaveDeterminationReject);
break;
case T_H245ResponseMessage_terminalCapabilitySetAck:
case T_H245ResponseMessage_terminalCapabilitySetReject:
OOTRACEINFO3("TerminalCapabilitySetReject message received."
" (%s, %s)\n", call->callType, call->callToken);
- if(response->u.terminalCapabilitySetReject->sequenceNumber !=
+ if(response->u.terminalCapabilitySetReject->sequenceNumber !=
call->localTermCapSeqNo)
{
OOTRACEINFO5("Ignoring TCSReject with mismatched seqno %d "
- "(local - %d). (%s, %s)\n",
+ "(local - %d). (%s, %s)\n",
response->u.terminalCapabilitySetReject->sequenceNumber,
call->localTermCapSeqNo, call->callType, call->callToken);
break;
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_OLC_TIMER) &&
- ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
+ if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_OLC_TIMER) &&
+ ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
response->u.openLogicalChannelAck->forwardLogicalChannelNumber)
{
memFreePtr(call->pctxt, pTimer->cbData);
ooTimerDelete(call->pctxt, &call->timerList, pTimer);
- OOTRACEDBGC3("Deleted OpenLogicalChannel Timer. (%s, %s)\n",
+ OOTRACEDBGC3("Deleted OpenLogicalChannel Timer. (%s, %s)\n",
call->callType, call->callToken);
break;
}
}
- ooOnReceivedOpenLogicalChannelAck(call,
+ ooOnReceivedOpenLogicalChannelAck(call,
response->u.openLogicalChannelAck);
break;
case T_H245ResponseMessage_openLogicalChannelReject:
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_OLC_TIMER) &&
- ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
+ if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_OLC_TIMER) &&
+ ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
response->u.openLogicalChannelAck->forwardLogicalChannelNumber)
{
ASN1MEMFREEPTR(call->pctxt, pTimer->cbData);
ooTimerDelete(call->pctxt, &call->timerList, pTimer);
- OOTRACEDBGC3("Deleted OpenLogicalChannel Timer. (%s, %s)\n",
+ OOTRACEDBGC3("Deleted OpenLogicalChannel Timer. (%s, %s)\n",
call->callType, call->callToken);
break;
}
}
- ooOnReceivedOpenLogicalChannelRejected(call,
+ ooOnReceivedOpenLogicalChannelRejected(call,
response->u.openLogicalChannelReject);
break;
case T_H245ResponseMessage_closeLogicalChannelAck:
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_CLC_TIMER) &&
- ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
+ if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_CLC_TIMER) &&
+ ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
response->u.closeLogicalChannelAck->forwardLogicalChannelNumber)
{
break;
}
}
- ooOnReceivedCloseChannelAck(call,
+ ooOnReceivedCloseChannelAck(call,
response->u.closeLogicalChannelAck);
if (call->TCSPending && !ooGetReceiveLogicalChannel(call)) {
call->TCSPending = FALSE;
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_RCC_TIMER) &&
- ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
+ if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_RCC_TIMER) &&
+ ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
response->u.requestChannelCloseAck->forwardLogicalChannelNumber)
{
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_RCC_TIMER) &&
- ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
+ if((((ooTimerCallback*)pTimer->cbData)->timerType & OO_RCC_TIMER) &&
+ ((ooTimerCallback*)pTimer->cbData)->channelNumber ==
response->u.requestChannelCloseReject->forwardLogicalChannelNumber)
{
break;
}
}
- ooOnReceivedRequestChannelCloseReject(call,
+ ooOnReceivedRequestChannelCloseReject(call,
response->u.requestChannelCloseReject);
break;
case T_H245ResponseMessage_roundTripDelayResponse:
default:
;
}
- OOTRACEDBGC3("Finished handling H245 message. (%s, %s)\n",
+ OOTRACEDBGC3("Finished handling H245 message. (%s, %s)\n",
call->callType, call->callToken);
return OO_OK;
}
int ooOnReceivedUserInputIndication
(OOH323CallData *call, H245UserInputIndication *indication)
{
- if((indication->t == T_H245UserInputIndication_alphanumeric) &&
+ if((indication->t == T_H245UserInputIndication_alphanumeric) &&
(call->dtmfmode & OO_CAP_DTMF_H245_alphanumeric))
{
if(gH323ep.h323Callbacks.onReceivedDTMF)
gH323ep.h323Callbacks.onReceivedDTMF(call,indication->u.alphanumeric);
}
- else if((indication->t == T_H245UserInputIndication_signal) &&
+ else if((indication->t == T_H245UserInputIndication_signal) &&
(call->dtmfmode & OO_CAP_DTMF_H245_signal)) {
if(call->lastDTMF && indication->u.signal->signalType[0] == call->lastDTMF &&
- call->nextDTMFstamp && indication->u.signal->m.rtpPresent &&
+ call->nextDTMFstamp && indication->u.signal->m.rtpPresent &&
indication->u.signal->rtp.m.timestampPresent) {
if(call->nextDTMFstamp > indication->u.signal->rtp.timestamp) {
- OOTRACEERR4("ERROR:Duplicate dtmf %c on ((%s, %s)\n", call->lastDTMF, call->callType,
+ OOTRACEERR4("ERROR:Duplicate dtmf %c on ((%s, %s)\n", call->lastDTMF, call->callType,
call->callToken);
return OO_OK;
}
call->lastDTMF = 0;
}
if(gH323ep.h323Callbacks.onReceivedDTMF)
- gH323ep.h323Callbacks.onReceivedDTMF(call,
+ gH323ep.h323Callbacks.onReceivedDTMF(call,
indication->u.signal->signalType);
}
else {
if(call->remoteTermCapSeqNo > tcs->sequenceNumber)
{
OOTRACEINFO4("Rejecting TermCapSet message with SeqNo %d, as already "
- "acknowledged message with this SeqNo (%s, %s)\n",
+ "acknowledged message with this SeqNo (%s, %s)\n",
call->remoteTermCapSeqNo, call->callType, call->callToken);
- ooSendTerminalCapabilitySetReject(call, tcs->sequenceNumber,
+ ooSendTerminalCapabilitySetReject(call, tcs->sequenceNumber,
T_H245TerminalCapabilitySetReject_cause_unspecified);
return OO_OK;
*/
/* 20111103 */
-/* for addition for previous we must check repeated tcs if it's not first
+/* for addition for previous we must check repeated tcs if it's not first
tcs i.e. SeqNo is not null */
if(call->remoteTermCapSeqNo && call->remoteTermCapSeqNo == tcs->sequenceNumber)
pNode = dListFindByIndex(&tcs->capabilityTable, k);
if(pNode)
{
- OOTRACEDBGC4("Processing CapabilityTable Entry %d (%s, %s)\n",
+ OOTRACEDBGC4("Processing CapabilityTable Entry %d (%s, %s)\n",
k, call->callType, call->callToken);
capEntry = (H245CapabilityTableEntry*) pNode->data;
if(capEntry->m.capabilityPresent){
if(ret != OO_OK)
{
OOTRACEERR4("Error:Failed to process remote capability in "
- "capability table at index %d. (%s, %s)\n",
+ "capability table at index %d. (%s, %s)\n",
k, call->callType, call->callToken);
}
ooCapabilityUpdateJointCapabilities(call, &capEntry->capability);
OO_SETFLAG(call->flags, OO_M_T38SUPPORTED);
else
OO_CLRFLAG(call->flags, OO_M_T38SUPPORTED);
-
+
/* Update remoteTermCapSetState */
call->remoteTermCapState = OO_RemoteTermCapSetRecvd;
- ooH245AcknowledgeTerminalCapabilitySet(call);
+ ooH245AcknowledgeTerminalCapabilitySet(call);
/* If we haven't yet send TCS then send it now */
if(call->localTermCapState == OO_LocalTermCapExchange_Idle)
"(%s, %s)\n", call->callType, call->callToken);
return ret;
}
- }
+ }
/* Check MasterSlave procedure has finished */
/* As both MasterSlave and TerminalCapabilitySet procedures have finished,
OpenLogicalChannels */
-
+
if(gH323ep.h323Callbacks.openLogicalChannels)
gH323ep.h323Callbacks.openLogicalChannels(call);
H245Message *ph245msg=NULL;
H245ResponseMessage * response=NULL;
OOCTXT *pctxt=NULL;
- int ret = ooCreateH245Message(call, &ph245msg,
+ int ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
/* pctxt = &gH323ep.msgctxt; */
pctxt = call->msgctxt;
response->t = T_H245ResponseMessage_terminalCapabilitySetReject;
-
+
response->u.terminalCapabilitySetReject = (H245TerminalCapabilitySetReject*)
ASN1MALLOC(pctxt, sizeof(H245TerminalCapabilitySetReject));
- memset(response->u.terminalCapabilitySetReject, 0,
+ memset(response->u.terminalCapabilitySetReject, 0,
sizeof(H245TerminalCapabilitySetReject));
response->u.terminalCapabilitySetReject->sequenceNumber = seqNo;
response->u.terminalCapabilitySetReject->cause.t = cause;
- OOTRACEDBGA3("Built TerminalCapabilitySetReject (%s, %s)\n",
+ OOTRACEDBGA3("Built TerminalCapabilitySetReject (%s, %s)\n",
call->callType, call->callToken);
-
+
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
{
H245Message *ph245msg=NULL;
H245ResponseMessage * response=NULL;
OOCTXT *pctxt=NULL;
- int ret = ooCreateH245Message(call, &ph245msg,
+ int ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_response);
if(ret != OO_OK)
{
/* pctxt = &gH323ep.msgctxt; */
pctxt = call->msgctxt;
response->t = T_H245ResponseMessage_terminalCapabilitySetAck;
-
+
response->u.terminalCapabilitySetAck = (H245TerminalCapabilitySetAck*)
ASN1MALLOC(pctxt, sizeof(H245TerminalCapabilitySetAck));
- memset(response->u.terminalCapabilitySetAck, 0,
+ memset(response->u.terminalCapabilitySetAck, 0,
sizeof(H245TerminalCapabilitySetAck));
response->u.terminalCapabilitySetAck->sequenceNumber = call->remoteTermCapSeqNo;
- OOTRACEDBGA3("Built TerminalCapabilitySet Ack (%s, %s)\n",
+ OOTRACEDBGA3("Built TerminalCapabilitySet Ack (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - Terminal"
- "CapabilitySetRelease (%s, %s)\n",call->callType,
+ "CapabilitySetRelease (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
indication->t = T_H245IndicationMessage_terminalCapabilitySetRelease;
- indication->u.terminalCapabilitySetRelease =
+ indication->u.terminalCapabilitySetRelease =
(H245TerminalCapabilitySetRelease*)
memAlloc (pctxt, sizeof(H245TerminalCapabilitySetRelease));
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
- OOTRACEDBGA3 ("Built TerminalCapabilitySetRelease (%s, %s)\n",
+ OOTRACEDBGA3 ("Built TerminalCapabilitySetRelease (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue TerminalCapabilitySetRelease "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
}
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - H245UserInput"
- "Indication_alphanumeric (%s, %s)\n",call->callType,
+ "Indication_alphanumeric (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
indication = ph245msg->h245Msg.u.indication;
indication->t = T_H245IndicationMessage_userInput;
- indication->u.userInput =
+ indication->u.userInput =
(H245UserInputIndication*)
memAllocZ (pctxt, sizeof(H245UserInputIndication));
return OO_FAILED;
}
strcpy(*(char**)&indication->u.userInput->u.alphanumeric, data);
- OOTRACEDBGA3 ("Built UserInputIndication_alphanumeric (%s, %s)\n",
+ OOTRACEDBGA3 ("Built UserInputIndication_alphanumeric (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue UserInputIndication_alphanumeric "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
}
if (ret != OO_OK) {
OOTRACEERR3("Error:H245 message creation failed for - H245UserInput"
- "Indication_signal (%s, %s)\n",call->callType,
+ "Indication_signal (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
indication = ph245msg->h245Msg.u.indication;
indication->t = T_H245IndicationMessage_userInput;
- indication->u.userInput =
+ indication->u.userInput =
(H245UserInputIndication*)
memAllocZ (pctxt, sizeof(H245UserInputIndication));
return OO_FAILED;
}
strcpy(*(char**)&indication->u.userInput->u.signal->signalType, data);
- OOTRACEDBGA3 ("Built UserInputIndication_signal (%s, %s)\n",
+ OOTRACEDBGA3 ("Built UserInputIndication_signal (%s, %s)\n",
call->callType, call->callToken);
ret = ooSendH245Msg (call, ph245msg);
if (ret != OO_OK) {
- OOTRACEERR3
+ OOTRACEERR3
("Error:Failed to enqueue UserInputIndication_signal "
- "message to outbound queue.(%s, %s)\n", call->callType,
+ "message to outbound queue.(%s, %s)\n", call->callType,
call->callToken);
}
-
+
ooFreeH245Message (call, ph245msg);
return ret;
}
int ooOpenLogicalChannels(OOH323CallData *call)
{
int ret=0;
- OOTRACEINFO3("Opening logical channels (%s, %s)\n", call->callType,
- call->callToken);
+ OOTRACEINFO3("Opening logical channels (%s, %s)\n", call->callType,
+ call->callToken);
/* Audio channels */
if(gH323ep.callMode == OO_CALLMODE_AUDIOCALL ||
return ret;
}
}
-
+
if(gH323ep.callMode == OO_CALLMODE_VIDEOCALL)
{
/* if (!OO_TESTFLAG (call->flags, OO_M_AUDIOSESSION))
" (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
-
+
/* Go through local endpoints capabilities sequentially, and find out the
first one which has a match in the remote endpoints receive capabilities.
*/
- OOTRACEINFO3("Looking for matching capabilities. (%s, %s)\n",
+ OOTRACEINFO3("Looking for matching capabilities. (%s, %s)\n",
call->callType, call->callToken);
/* May */
if(call->masterSlaveState == OO_MasterSlave_Master)
for(k=0; k<call->capPrefs.index; k++)
{
/*Search for audio caps only */
- if(capType == OO_CAP_TYPE_AUDIO &&
+ if(capType == OO_CAP_TYPE_AUDIO &&
call->capPrefs.order[k] > OO_CAP_VIDEO_BASE)
continue;
/* Search for video caps only */
- if(capType == OO_CAP_TYPE_VIDEO &&
+ if(capType == OO_CAP_TYPE_VIDEO &&
call->capPrefs.order[k] <= OO_CAP_VIDEO_BASE)
continue;
if(!epCap)
{
OOTRACEERR4("ERROR:Incompatible capabilities - Can not open "
- "%s channel (%s, %s)\n",
+ "%s channel (%s, %s)\n",
(capType==OO_CAP_TYPE_AUDIO)?"audio":"video", call->callType,
call->callToken);
return OO_FAILED;
if(!epCap)
{
OOTRACEERR4("ERROR:Incompatible audio capabilities - Can not open "
- "%s channel (%s, %s)\n",
+ "%s channel (%s, %s)\n",
(capType==OO_CAP_TYPE_AUDIO)?"audio":"video", call->callType,
call->callToken);
return OO_FAILED;
}
-
+
}
switch(epCap->cap)
ooOpenChannel(call, epCap);
break;
-
+
default:
- OOTRACEERR3("ERROR:Unknown Audio Capability type (%s, %s)\n",
+ OOTRACEERR3("ERROR:Unknown Audio Capability type (%s, %s)\n",
call->callType, call->callToken);
}
return OO_OK;
H245UnicastAddress_iP6Address *iP6Address = NULL;
unsigned session_id=0;
ooLogicalChannel *pLogicalChannel = NULL;
-
- OOTRACEDBGC4("Doing Open Channel for %s. (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+
+ OOTRACEDBGC4("Doing Open Channel for %s. (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
- ret = ooCreateH245Message(call, &ph245msg,
+ ret = ooCreateH245Message(call, &ph245msg,
T_H245MultimediaSystemControlMessage_request);
if(ret != OO_OK)
{
OOTRACEERR4("Error: H245 message creation failed for - Open %s"
- "channel (%s, %s)\n", ooGetCapTypeText(epCap->cap),
+ "channel (%s, %s)\n", ooGetCapTypeText(epCap->cap),
call->callType, call->callToken);
return OO_FAILED;
}
ph245msg->logicalChannelNo = call->logicalChanNoCur++;
if(call->logicalChanNoCur > call->logicalChanNoMax)
- call->logicalChanNoCur = call->logicalChanNoBase;
+ call->logicalChanNoCur = call->logicalChanNoBase;
request = ph245msg->h245Msg.u.request;
/* pctxt = &gH323ep.msgctxt; */
return OO_FAILED;
}
- memset(request->u.openLogicalChannel, 0,
+ memset(request->u.openLogicalChannel, 0,
sizeof(H245OpenLogicalChannel));
- request->u.openLogicalChannel->forwardLogicalChannelNumber =
+ request->u.openLogicalChannel->forwardLogicalChannelNumber =
ph245msg->logicalChannelNo;
-
+
session_id = ooCallGenerateSessionID(call, epCap->capType, "transmit");
- pLogicalChannel = ooAddNewLogicalChannel(call,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
request->u.openLogicalChannel->forwardLogicalChannelNumber,
session_id, "transmit", epCap);
-
+
if(!pLogicalChannel)
{
OOTRACEERR3("ERROR:Failed to add new logical channel entry (%s, %s)\n",
if(!audioCap)
{
OOTRACEERR4("Error:Failed to create duplicate audio capability in "
- "ooOpenChannel- %s (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ "ooOpenChannel- %s (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
flcp->dataType.u.audioData = audioCap;
}
else if(epCap->capType == OO_CAP_TYPE_VIDEO)
{
- flcp->dataType.t = T_H245DataType_videoData;
+ flcp->dataType.t = T_H245DataType_videoData;
videoCap = ooCapabilityCreateVideoCapability(epCap, pctxt, OOTX);
if(!videoCap)
{
OOTRACEERR4("Error:Failed to create duplicate video capability in "
- "ooOpenChannel- %s (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ "ooOpenChannel- %s (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
flcp->dataType.u.videoData = videoCap;
}
else if(epCap->capType == OO_CAP_TYPE_DATA)
if(!t38Cap)
{
OOTRACEERR4("Error:Failed to create duplicate T38 capability in "
- "ooOpenChannel- %s (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ "ooOpenChannel- %s (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
ooFreeH245Message(call, ph245msg);
return OO_FAILED;
}
-
+
flcp->dataType.u.data = t38Cap;
}
else{
return OO_FAILED;
}
-
- flcp->multiplexParameters.t =
+
+ flcp->multiplexParameters.t =
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters;
- flcp->multiplexParameters.u.h2250LogicalChannelParameters =
- (H245H2250LogicalChannelParameters*)ASN1MALLOC(pctxt,
+ flcp->multiplexParameters.u.h2250LogicalChannelParameters =
+ (H245H2250LogicalChannelParameters*)ASN1MALLOC(pctxt,
sizeof(H245H2250LogicalChannelParameters));
h2250lcp = flcp->multiplexParameters.u.h2250LogicalChannelParameters;
h2250lcp->mediaGuaranteedDelivery = 0;
h2250lcp->silenceSuppression = 0;
h2250lcp->m.mediaControlChannelPresent = 1;
-
- h2250lcp->mediaControlChannel.t =
+
+ h2250lcp->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
h2250lcp->mediaControlChannel.u.unicastAddress = (H245UnicastAddress*)
ASN1MALLOC(pctxt, sizeof(H245UnicastAddress));
iPAddress->network.numocts = 4;
iPAddress->tsapIdentifier = pLogicalChannel->localRtcpPort;
}
- pLogicalChannel->state = OO_LOGICALCHAN_PROPOSED;
- OOTRACEDBGA4("Built OpenLogicalChannel-%s (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ pLogicalChannel->state = OO_LOGICALCHAN_PROPOSED;
+ OOTRACEDBGA4("Built OpenLogicalChannel-%s (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
ret = ooSendH245Msg(call, ph245msg);
if(ret != OO_OK)
call->callToken);
}
ooFreeH245Message(call, ph245msg);
-
+
return ret;
}
-/* Used to build OLCs for fast connect. Keep in mind that forward and
- reverse
- are always with respect to the endpoint which proposes channels
+/* Used to build OLCs for fast connect. Keep in mind that forward and
+ reverse
+ are always with respect to the endpoint which proposes channels
TODO: Need to clean logical channel in case of failure. */
int ooBuildFastStartOLC
- (OOH323CallData *call, H245OpenLogicalChannel *olc,
+ (OOH323CallData *call, H245OpenLogicalChannel *olc,
ooH323EpCapability *epCap, OOCTXT*pctxt, int dir)
{
OOBOOL reverse=FALSE, forward=FALSE;
ooLogicalChannel *pLogicalChannel = NULL;
int outgoing=FALSE;
- if(!strcmp(call->callType, "outgoing"))
+ if(!strcmp(call->callType, "outgoing"))
outgoing = TRUE;
-
+
if(dir & OORX)
{
OOTRACEDBGA3("Building OpenLogicalChannel for Receive Capability "
"(%s, %s)\n", call->callType, call->callToken);
session_id = ooCallGenerateSessionID(call, epCap->capType, "receive");
- pLogicalChannel = ooAddNewLogicalChannel(call,
- olc->forwardLogicalChannelNumber, session_id,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
+ olc->forwardLogicalChannelNumber, session_id,
"receive", epCap);
if(outgoing)
reverse = TRUE;
OOTRACEDBGA3("Building OpenLogicalChannel for transmit Capability "
"(%s, %s)\n", call->callType, call->callToken);
session_id = ooCallGenerateSessionID(call, epCap->capType, "transmit");
- pLogicalChannel = ooAddNewLogicalChannel(call,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
olc->forwardLogicalChannelNumber, session_id,
"transmit", epCap);
if(outgoing)
if(forward)
{
- OOTRACEDBGC3("Building forward olc. (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building forward olc. (%s, %s)\n", call->callType,
call->callToken);
flcp = &(olc->forwardLogicalChannelParameters);
- memset(flcp, 0,
+ memset(flcp, 0,
sizeof(H245OpenLogicalChannel_forwardLogicalChannelParameters));
if(epCap->capType == OO_CAP_TYPE_AUDIO) {
sessionID =1;
flcp->dataType.t = T_H245DataType_audioData;
- flcp->dataType.u.audioData = ooCapabilityCreateAudioCapability(epCap,
+ flcp->dataType.u.audioData = ooCapabilityCreateAudioCapability(epCap,
pctxt, dir);
}
else if(epCap->capType == OO_CAP_TYPE_VIDEO) {
pctxt, dir);
}
flcp->multiplexParameters.t = T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters;
- pH2250lcp1 = (H245H2250LogicalChannelParameters*)ASN1MALLOC(pctxt,
+ pH2250lcp1 = (H245H2250LogicalChannelParameters*)ASN1MALLOC(pctxt,
sizeof(H245H2250LogicalChannelParameters));
memset(pH2250lcp1, 0, sizeof(H245H2250LogicalChannelParameters));
flcp->multiplexParameters.t = T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters;
-
+
flcp->multiplexParameters.u.h2250LogicalChannelParameters = pH2250lcp1;
-
+
pH2250lcp1->sessionID = sessionID;
if(!outgoing)
{
pH2250lcp1->m.mediaChannelPresent = 1;
- pH2250lcp1->mediaChannel.t =
+ pH2250lcp1->mediaChannel.t =
T_H245TransportAddress_unicastAddress;
- pUniAddrs = (H245UnicastAddress*) ASN1MALLOC(pctxt,
+ pUniAddrs = (H245UnicastAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress));
memset(pUniAddrs, 0, sizeof(H245UnicastAddress));
pH2250lcp1->mediaChannel.u.unicastAddress = pUniAddrs;
if (call->versionIP == 6) {
pUniAddrs->t = T_H245UnicastAddress_iP6Address;
- pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
+ pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iP6Address));
memset(pUniIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address));
pUniAddrs->u.iP6Address = pUniIp6Addrs;
-
+
inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data);
pUniIp6Addrs->network.numocts = 16;
pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort;
} else {
pUniAddrs->t = T_H245UnicastAddress_iPAddress;
- pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
+ pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iPAddress));
memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
pUniAddrs->u.iPAddress = pUniIpAddrs;
-
+
inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data);
pUniIpAddrs->network.numocts = 4;
}
}
pH2250lcp1->m.mediaControlChannelPresent = 1;
- pH2250lcp1->mediaControlChannel.t =
+ pH2250lcp1->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
- pUnicastAddrs = (H245UnicastAddress*) ASN1MALLOC(pctxt,
+ pUnicastAddrs = (H245UnicastAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress));
memset(pUnicastAddrs, 0, sizeof(H245UnicastAddress));
pH2250lcp1->mediaControlChannel.u.unicastAddress = pUnicastAddrs;
if (call->versionIP == 6) {
pUnicastAddrs->t = T_H245UnicastAddress_iP6Address;
- pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
+ pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iP6Address));
memset(pIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address));
pUnicastAddrs->u.iP6Address = pIp6Addrs;
-
+
inet_pton(AF_INET6, pLogicalChannel->localIP, pIp6Addrs->network.data);
pIp6Addrs->network.numocts = 16;
pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
} else {
pUnicastAddrs->t = T_H245UnicastAddress_iPAddress;
- pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
+ pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iPAddress));
memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
pUnicastAddrs->u.iPAddress = pIpAddrs;
-
+
inet_pton(AF_INET, pLogicalChannel->localIP, pIpAddrs->network.data);
pIpAddrs->network.numocts = 4;
if(!outgoing)
{
if(epCap->startReceiveChannel)
- {
- epCap->startReceiveChannel(call, pLogicalChannel);
- OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",
+ {
+ epCap->startReceiveChannel(call, pLogicalChannel);
+ OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",
(epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
call->callType, call->callToken);
}
else{
OOTRACEERR4("ERROR:No callback registered to start receive %s"
- " channel (%s, %s)\n",
- (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
+ " channel (%s, %s)\n",
+ (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
call->callType, call->callToken);
return OO_FAILED;
}
if(reverse)
{
- OOTRACEDBGC3("Building reverse olc. (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building reverse olc. (%s, %s)\n", call->callType,
call->callToken);
- olc->forwardLogicalChannelParameters.dataType.t =
+ olc->forwardLogicalChannelParameters.dataType.t =
T_H245DataType_nullData;
- olc->forwardLogicalChannelParameters.multiplexParameters.t =
+ olc->forwardLogicalChannelParameters.multiplexParameters.t =
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_none;
olc->m.reverseLogicalChannelParametersPresent = 1;
rlcp = &(olc->reverseLogicalChannelParameters);
if(epCap->capType == OO_CAP_TYPE_AUDIO) {
sessionID = 1;
rlcp->dataType.t = T_H245DataType_audioData;
-
- rlcp->dataType.u.audioData = ooCapabilityCreateAudioCapability(epCap,
+
+ rlcp->dataType.u.audioData = ooCapabilityCreateAudioCapability(epCap,
pctxt, dir);
}
else if(epCap->capType == OO_CAP_TYPE_VIDEO) {
sessionID = 2;
rlcp->dataType.t = T_H245DataType_videoData;
-
- rlcp->dataType.u.videoData = ooCapabilityCreateVideoCapability(epCap,
+
+ rlcp->dataType.u.videoData = ooCapabilityCreateVideoCapability(epCap,
pctxt, dir);
}
{
pH2250lcp2->m.mediaChannelPresent = 1;
- pH2250lcp2->mediaChannel.t =
+ pH2250lcp2->mediaChannel.t =
T_H245TransportAddress_unicastAddress;
- pUnicastAddrs = (H245UnicastAddress*) memAlloc(pctxt,
+ pUnicastAddrs = (H245UnicastAddress*) memAlloc(pctxt,
sizeof(H245UnicastAddress));
memset(pUnicastAddrs, 0, sizeof(H245UnicastAddress));
pH2250lcp2->mediaChannel.u.unicastAddress = pUnicastAddrs;
/* May 20101022 */
-
+
if (call->versionIP == 6) {
pUnicastAddrs->t = T_H245UnicastAddress_iP6Address;
- pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
+ pIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iP6Address));
memset(pIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address));
pUnicastAddrs->u.iP6Address = pIp6Addrs;
-
+
inet_pton(AF_INET6, pLogicalChannel->localIP, pIp6Addrs->network.data);
pIp6Addrs->network.numocts = 16;
pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort;
} else {
pUnicastAddrs->t = T_H245UnicastAddress_iPAddress;
- pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
+ pIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iPAddress));
memset(pIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
pUnicastAddrs->u.iPAddress = pIpAddrs;
-
+
inet_pton(AF_INET, pLogicalChannel->localIP, pIpAddrs->network.data);
pIpAddrs->network.numocts = 4;
}
pH2250lcp2->m.mediaControlChannelPresent = 1;
- pH2250lcp2->mediaControlChannel.t =
+ pH2250lcp2->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
pUniAddrs = (H245UnicastAddress*) ASN1MALLOC(pctxt, sizeof(H245UnicastAddress));
-
+
memset(pUniAddrs, 0, sizeof(H245UnicastAddress));
pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs;
/* May 20101023 */
-
+
if (call->versionIP == 6) {
pUniAddrs->t = T_H245UnicastAddress_iP6Address;
- pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
+ pUniIp6Addrs = (H245UnicastAddress_iP6Address*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iP6Address));
memset(pUniIp6Addrs, 0, sizeof(H245UnicastAddress_iP6Address));
pUniAddrs->u.iP6Address = pUniIp6Addrs;
-
+
inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data);
pUniIp6Addrs->network.numocts = 16;
pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
} else {
pUniAddrs->t = T_H245UnicastAddress_iPAddress;
- pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
+ pUniIpAddrs = (H245UnicastAddress_iPAddress*) ASN1MALLOC(pctxt,
sizeof(H245UnicastAddress_iPAddress));
memset(pUniIpAddrs, 0, sizeof(H245UnicastAddress_iPAddress));
pUniAddrs->u.iPAddress = pUniIpAddrs;
-
+
inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data);
pUniIpAddrs->network.numocts = 4;
{
if(epCap->startReceiveChannel)
{
- epCap->startReceiveChannel(call, pLogicalChannel);
+ epCap->startReceiveChannel(call, pLogicalChannel);
OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",
(epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
call->callType, call->callToken);
}
else{
OOTRACEERR4("ERROR:No callback registered to start receive %s "
- "channel (%s, %s)\n",
- (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
+ "channel (%s, %s)\n",
+ (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
call->callType, call->callToken);
return OO_FAILED;
}
}
}
- /* State of logical channel. for out going calls, as we are sending setup,
- state of all channels are proposed, for incoming calls, state is
+ /* State of logical channel. for out going calls, as we are sending setup,
+ state of all channels are proposed, for incoming calls, state is
established. */
if(!outgoing) {
pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED;
/* Call is "outgoing */
pLogicalChannel->state = OO_LOGICALCHAN_PROPOSEDFS;
}
-
+
return OO_OK;
}
return OO_OK;
}
-
+
int ooTCSTimerExpired(void *data)
{
ooTimerCallback *cbData = (ooTimerCallback*)data;
OOH323CallData *call = cbData->call;
- OOTRACEINFO3("TerminalCapabilityExchange timeout. (%s, %s)\n",
+ OOTRACEINFO3("TerminalCapabilityExchange timeout. (%s, %s)\n",
call->callType, call->callToken);
ASN1MEMFREEPTR(call->pctxt, cbData);
ooSendTerminalCapabilitySetRelease(call);
ooLogicalChannel *pChannel = NULL;
OOTRACEINFO3("OpenLogicalChannelTimer expired. (%s, %s)\n", call->callType,
call->callToken);
- pChannel = ooFindLogicalChannelByLogicalChannelNo(call,
+ pChannel = ooFindLogicalChannelByLogicalChannelNo(call,
cbData->channelNumber);
if(pChannel)
ooSendCloseLogicalChannel(call, pChannel);
-
+
if(call->callState < OO_CALL_CLEAR)
{
call->callState = OO_CALL_CLEAR;
call->callToken);
ooClearLogicalChannel(call, cbData->channelNumber);
-
+
if(call->callState < OO_CALL_CLEAR)
{
call->callState = OO_CALL_CLEAR;
OOTRACEINFO3("CloseLogicalChannelTimer expired. (%s, %s)\n", call->callType,
call->callToken);
-
- pChannel = ooFindLogicalChannelByLogicalChannelNo(call,
+
+ pChannel = ooFindLogicalChannelByLogicalChannelNo(call,
cbData->channelNumber);
if(pChannel)
ooSendRequestChannelCloseRelease(call, cbData->channelNumber);
else
return OO_OK;
-
+
ret = ooClearLogicalChannel(call, cbData->channelNumber);
if(ret != OO_OK)
{
OOTRACEERR4("Error:Failed to clear logical channel %d. (%s, %s)\n",
cbData->channelNumber, call->callType, call->callToken);
- }
+ }
if(call->callState < OO_CALL_CLEAR)
{
OOTRACEINFO3("SessionTimer expired. (%s, %s)\n", call->callType,
call->callToken);
- if(call->h245SessionState != OO_H245SESSION_IDLE &&
+ if(call->h245SessionState != OO_H245SESSION_IDLE &&
call->h245SessionState != OO_H245SESSION_CLOSED &&
call->h245SessionState != OO_H245SESSION_PAUSED) {
ret = ooCloseH245Connection(call);
-
+
if(ret != OO_OK) {
OOTRACEERR3("Error:Failed to close H.245 connection (%s, %s)\n",
call->callType, call->callToken);
- }
+ }
}
memFreePtr(call->pctxt, cbData);
if(call->callState == OO_CALL_CLEAR_RELEASESENT)
call->callState = OO_CALL_CLEARED;
-
+
return OO_OK;
}
int ooGetIpPortFromH245TransportAddress
- (OOH323CallData *call, H245TransportAddress *h245Address, char *ip,
+ (OOH323CallData *call, H245TransportAddress *h245Address, char *ip,
int *port)
{
H245UnicastAddress *unicastAddress = NULL;
OOTRACEERR3("ERROR:Unsupported H245 address type "
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
- }
-
+ }
+
unicastAddress = h245Address->u.unicastAddress;
if (call->versionIP == 6) {
if (unicastAddress->t != T_H245UnicastAddress_iP6Address) {
int ooPrepareFastStartResponseOLC
- (OOH323CallData *call, H245OpenLogicalChannel *olc,
+ (OOH323CallData *call, H245OpenLogicalChannel *olc,
ooH323EpCapability *epCap, OOCTXT*pctxt, int dir)
{
OOBOOL reverse=FALSE, forward=FALSE;
H245UnicastAddress_iP6Address *pIp6Addrs=NULL, *pUniIp6Addrs=NULL;
unsigned session_id = 0;
ooLogicalChannel *pLogicalChannel = NULL;
-
+
if(dir & OORX)
{
OOTRACEDBGA3("ooPrepareFastStartResponseOLC for Receive Capability "
"(%s, %s)\n", call->callType, call->callToken);
session_id = ooCallGenerateSessionID(call, epCap->capType, "receive");
- pLogicalChannel = ooAddNewLogicalChannel(call,
- olc->forwardLogicalChannelNumber, session_id,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
+ olc->forwardLogicalChannelNumber, session_id,
"receive", epCap);
forward = TRUE;
}
OOTRACEDBGA3("ooPrepareFastStartResponseOLC for transmit Capability "
"(%s, %s)\n", call->callType, call->callToken);
session_id = ooCallGenerateSessionID(call, epCap->capType, "transmit");
- pLogicalChannel = ooAddNewLogicalChannel(call,
+ pLogicalChannel = ooAddNewLogicalChannel(call,
olc->forwardLogicalChannelNumber, session_id,
"transmit", epCap);
reverse = TRUE;
if(forward)
{
- OOTRACEDBGC3("Preparing olc for receive channel. (%s, %s)\n",
+ OOTRACEDBGC3("Preparing olc for receive channel. (%s, %s)\n",
call->callType, call->callToken);
flcp = &(olc->forwardLogicalChannelParameters);
pH2250lcp1 = flcp->multiplexParameters.u.h2250LogicalChannelParameters;
-
+
pH2250lcp1->m.mediaChannelPresent = 1;
pH2250lcp1->mediaChannel.t = T_H245TransportAddress_unicastAddress;
- pUniAddrs = (H245UnicastAddress*) memAllocZ(pctxt,
+ pUniAddrs = (H245UnicastAddress*) memAllocZ(pctxt,
sizeof(H245UnicastAddress));
pH2250lcp1->mediaChannel.u.unicastAddress = pUniAddrs;
if (call->versionIP == 6) {
- pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt,
+ pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt,
sizeof(H245UnicastAddress_iP6Address));
if(!pUniAddrs || !pUniIpAddrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - pUniAddrs"
- "/pUniIpAddrs (%s, %s)\n", call->callType,
+ "/pUniIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtpPort;
} else {
- pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt,
+ pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt,
sizeof(H245UnicastAddress_iPAddress));
if(!pUniAddrs || !pUniIpAddrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - pUniAddrs"
- "/pUniIpAddrs (%s, %s)\n", call->callType,
+ "/pUniIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
pUniAddrs->t = T_H245UnicastAddress_iPAddress;
pUniAddrs->u.iPAddress = pUniIpAddrs;
inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data);
-
+
pUniIpAddrs->network.numocts = 4;
pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtpPort;
}
pH2250lcp1->m.mediaControlChannelPresent = 1;
- pH2250lcp1->mediaControlChannel.t =
+ pH2250lcp1->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
- pUnicastAddrs = (H245UnicastAddress*) memAllocZ(pctxt,
+ pUnicastAddrs = (H245UnicastAddress*) memAllocZ(pctxt,
sizeof(H245UnicastAddress));
pH2250lcp1->mediaControlChannel.u.unicastAddress = pUnicastAddrs;
if (call->versionIP == 6) {
- pIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt,
+ pIp6Addrs = (H245UnicastAddress_iP6Address*) memAllocZ(pctxt,
sizeof(H245UnicastAddress_iP6Address));
if(!pUnicastAddrs || !pIp6Addrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - "
- "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType,
+ "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
pIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
} else {
- pIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt,
+ pIpAddrs = (H245UnicastAddress_iPAddress*) memAllocZ(pctxt,
sizeof(H245UnicastAddress_iPAddress));
if(!pUnicastAddrs || !pIpAddrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - "
- "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType,
+ "pUnicastAddrs/pIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
if(reverse)
{
- OOTRACEDBGC3("Building reverse olc. (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building reverse olc. (%s, %s)\n", call->callType,
call->callToken);
rlcp = &(olc->reverseLogicalChannelParameters);
memset(&pH2250lcp2->mediaChannel, 0, sizeof(H245TransportAddress));
pH2250lcp2->m.mediaControlChannelPresent = 1;
- pH2250lcp2->mediaControlChannel.t =
+ pH2250lcp2->mediaControlChannel.t =
T_H245TransportAddress_unicastAddress;
- pUniAddrs = (H245UnicastAddress*) memAlloc(pctxt,
+ pUniAddrs = (H245UnicastAddress*) memAlloc(pctxt,
sizeof(H245UnicastAddress));
pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs;
if (call->versionIP == 6) {
- pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAlloc(pctxt,
+ pUniIp6Addrs = (H245UnicastAddress_iP6Address*) memAlloc(pctxt,
sizeof(H245UnicastAddress_iP6Address));
if(!pUniAddrs || !pUniIp6Addrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - "
- "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType,
+ "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
-
+
pUniAddrs->t = T_H245UnicastAddress_iP6Address;
- pUniAddrs->u.iP6Address = pUniIp6Addrs;
+ pUniAddrs->u.iP6Address = pUniIp6Addrs;
inet_pton(AF_INET6, pLogicalChannel->localIP, pUniIp6Addrs->network.data);
pUniIp6Addrs->network.numocts = 16;
pUniIp6Addrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
} else {
- pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt,
+ pUniIpAddrs = (H245UnicastAddress_iPAddress*) memAlloc(pctxt,
sizeof(H245UnicastAddress_iPAddress));
if(!pUniAddrs || !pUniIpAddrs) {
OOTRACEERR3("Error:Memory - ooPrepareFastStartResponseOLC - "
- "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType,
+ "pUniAddrs/pUniIpAddrs (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
pH2250lcp2->mediaControlChannel.u.unicastAddress = pUniAddrs;
-
+
pUniAddrs->t = T_H245UnicastAddress_iPAddress;
- pUniAddrs->u.iPAddress = pUniIpAddrs;
+ pUniAddrs->u.iPAddress = pUniIpAddrs;
inet_pton(AF_INET, pLogicalChannel->localIP, pUniIpAddrs->network.data);
pUniIpAddrs->network.numocts = 4;
pUniIpAddrs->tsapIdentifier = pLogicalChannel->localRtcpPort;
}
-
+
}
pLogicalChannel->state = OO_LOGICALCHAN_ESTABLISHED;
return OO_OK;
}
-
-
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooh245.h
- * This file contains functions to support H245 negotiations.
+ * @file ooh245.h
+ * This file contains functions to support H245 negotiations.
*/
#ifndef _OOH245HDR_H_
#define _OOH245HDR_H_
struct OOH323CallData;
-/**
+/**
* @defgroup h245 H.245 Message Handling
* @{
*/
/**
* Creates an outgoing H245 message of the type specified by the type
- * argument for the Application context.
+ * argument for the Application context.
*
- * @param msg A pointer to pointer to message which will be assigned to
+ * @param msg A pointer to pointer to message which will be assigned to
* allocated memory.
* @param type Type of the message to be created.
* (Request/Response/Command/Indication)
*
* @return Completion status of operation: 0 (OO_OK) = success,
- * negative return value is error.
+ * negative return value is error.
*/
EXTERN int ooCreateH245Message(OOH323CallData* call, H245Message **msg, int type);
* @param call Handle to the call
* @param pmsg Pointer to an H245 message structure.
*
- * @return OO_OK, on success. OO_FAILED, on failure
+ * @return OO_OK, on success. OO_FAILED, on failure
*/
EXTERN int ooFreeH245Message(struct OOH323CallData *call, H245Message *pmsg);
EXTERN int ooSendH245Msg(struct OOH323CallData *call, H245Message *msg);
/**
- * This function is used to retrieve an H.245 message enqueued in the outgoing
- * queue.
+ * This function is used to retrieve an H.245 message enqueued in the outgoing
+ * queue.
* @param call Pointer to the call for which message has to be retrieved.
* @param msgbuf Pointer to a buffer in which the message will be returned.
* @param len Pointer to an int variable which will contain length of
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooGetOutgoingH245Msgbuf(struct OOH323CallData *call,
- ASN1OCTET *msgbuf,
+EXTERN int ooGetOutgoingH245Msgbuf(struct OOH323CallData *call,
+ ASN1OCTET *msgbuf,
int *len, int *msgType);
/**
- * This function is used to send out a terminal capability set message.
+ * This function is used to send out a terminal capability set message.
*
* @param call Pointer to a call for which TerminalCapabilitySet message
* will be sent.
- *
- * @return OO_OK, on success. OO_FAILED, on failure.
+ *
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooSendTermCapMsg(struct OOH323CallData *call);
EXTERN int ooSendEmptyTermCapMsg(struct OOH323CallData *call);
/**
* This fuction is used to handle received MasterSlaveDetermination procedure
- * messages.
+ * messages.
* @param call Pointer to the call for which a message is received.
* @param pmsg Pointer to MSD message
- * @param msgType Message type indicating whether received message is MSD,
+ * @param msgType Message type indicating whether received message is MSD,
* MSDAck, MSDReject etc...
*
* @return OO_OK, on success. OO_FAILED, on failure.
* This function is used to send a MasterSlaveDeterminationAck message.
* @param call Pointer to call for which MasterSlaveDeterminationAck has
* to be sent.
- * @param status Result of the determination process(Master/Slave as it
+ * @param status Result of the determination process(Master/Slave as it
* applies to remote endpoint)
*
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooSendMasterSlaveDeterminationAck
(struct OOH323CallData* call, char * status);
* This function is used to send a MasterSlaveDeterminationReject message.
* @param call Pointer to call for which message is to be sent.
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooSendMasterSlaveDeterminationReject (struct OOH323CallData* call);
/**
* This function is used to handle MasterSlaveReject message. If number of
- * retries is less than max allowed, then it restarts the
+ * retries is less than max allowed, then it restarts the
* MasterSlaveDetermination procedure.
- * @param call Handle to the call for which MasterSlaveReject is
+ * @param call Handle to the call for which MasterSlaveReject is
* received.
* @param reject Poinetr to the received reject message.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooHandleMasterSlaveReject
(struct OOH323CallData *call, H245MasterSlaveDeterminationReject* reject);
(struct OOH323CallData* call, H245OpenLogicalChannel *olc);
/**
- * This is a helper function used to handle a received OpenLogicalChannel
+ * This is a helper function used to handle a received OpenLogicalChannel
* message. It builds an OpenLogicalChannelAck message and sends it.
*
* @param call Pointer to cll for which OLC was received.
* @param olc The received OpenLogicalChannel message.
- *
- * @return OO_OK, on success. OO_FAILED, on failure.
+ *
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooHandleOpenLogicalChannel_helper
(struct OOH323CallData *call, H245OpenLogicalChannel*olc);
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooOnReceivedOpenLogicalChannelAck(struct OOH323CallData *call,
+EXTERN int ooOnReceivedOpenLogicalChannelAck(struct OOH323CallData *call,
H245OpenLogicalChannelAck *olcAck);
/**
- * This function is used to handle the received OpenLogicalChannelReject
+ * This function is used to handle the received OpenLogicalChannelReject
* message.
* @param call Handle to the call for which the message is received.
* @param olcRejected Pointer to received OpenLogicalChannelReject message.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-int ooOnReceivedOpenLogicalChannelRejected(struct OOH323CallData *call,
+int ooOnReceivedOpenLogicalChannelRejected(struct OOH323CallData *call,
H245OpenLogicalChannelReject *olcRejected);
/**
- * This message is used to send an EndSession command. It builds a EndSession
+ * This message is used to send an EndSession command. It builds a EndSession
* command message and queues it into the calls outgoing queue.
* @param call Pointer to call for which EndSession command has to be
* sent.
EXTERN int ooSendEndSessionCommand(struct OOH323CallData *call);
/**
- * This function is used to handle a received H245Command message.
+ * This function is used to handle a received H245Command message.
* @param call Pointer to call for which an H245Command is received.
* @param command Pointer to a command message.
*
/**
* This function is used to handle a received UserInput Indication message.
* It extracts the dtmf received through user-input message and calls endpoints
- * onReceivedDTMF callback function, if such a function is registered by the
+ * onReceivedDTMF callback function, if such a function is registered by the
* endpoint.
* @param call Handle to the call for which user-input indication
* message is received.
/**
* This function is called on receiving a TreminalCapabilitySetAck message.
- * If the MasterSlaveDetermination process is also over, this function
+ * If the MasterSlaveDetermination process is also over, this function
* initiates the process of opening logical channels.
* @param call Pointer to call for which TCSAck is received.
*
/**
* This function is called to close all the open logical channels. It sends
- * CloseLogicalChannel message for all the forward channels and sends
+ * CloseLogicalChannel message for all the forward channels and sends
* RequestCloseLogicalChannel message for all the reverse channels.
- * @param call Pointer to call for which logical channels have to be
+ * @param call Pointer to call for which logical channels have to be
* closed.
*
* @return OO_OK, on success. OO_FAILED, on failure.
* closeLogicalChannelAck message to the remote endpoint.
* @param call Pointer to call for which CloseLogicalChannel message is received.
* @param clc Pointer to received CloseLogicalChannel message.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooOnReceivedCloseLogicalChannel(struct OOH323CallData *call,
+EXTERN int ooOnReceivedCloseLogicalChannel(struct OOH323CallData *call,
H245CloseLogicalChannel* clc);
/**
* channel and removes it from the list of active logical channels.
* @param call Pointer to call for which CLCAck message is received.
* @param clcAck Pointer to the received CloseLogicalChannelAck message.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure
*/
-EXTERN int ooOnReceivedCloseChannelAck(struct OOH323CallData* call,
+EXTERN int ooOnReceivedCloseChannelAck(struct OOH323CallData* call,
H245CloseLogicalChannelAck* clcAck);
/**
* @param call Pointer to call for which logical channels have to be opened.
*
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooOpenLogicalChannels(struct OOH323CallData *call);
/**
- * This function is used to send OpenLogicalChannel message for audio/video
+ * This function is used to send OpenLogicalChannel message for audio/video
* channel.
* @param call Pointer to call for which channel has to be opened.
* @param capType Type of media channel.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooOpenLogicalChannel(struct OOH323CallData *call,
+EXTERN int ooOpenLogicalChannel(struct OOH323CallData *call,
enum OOCapType capType);
/**
* This function is used to build and send OpenLogicalChannel message using
* capability passed as parameter.
- * @param call Pointer to call for which OpenLogicalChannel message
+ * @param call Pointer to call for which OpenLogicalChannel message
* has to be built.
* @param epCap Pointer to capability
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooOpenChannel
/**
* This function is used to request a remote end point to close a logical
- * channel.
+ * channel.
* @param call Pointer to call for which the logical channel has to
* be closed.
* @param logicalChan Pointer to the logical channel structure which needs
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooSendRequestCloseLogicalChannel(struct OOH323CallData *call,
+EXTERN int ooSendRequestCloseLogicalChannel(struct OOH323CallData *call,
ooLogicalChannel *logicalChan);
/**
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooOnReceivedRequestChannelClose(struct OOH323CallData *call,
+EXTERN int ooOnReceivedRequestChannelClose(struct OOH323CallData *call,
H245RequestChannelClose *rclc);
/**
- * This function is used to handle a received RequestChannelCloseReject
+ * This function is used to handle a received RequestChannelCloseReject
* response message.
* @param call Handle to the call.
* @param rccReject Pointer to the received reject response message.
(struct OOH323CallData *call, H245RequestChannelCloseReject *rccReject);
/**
- * This function is used to handle a received RequestChannelCloseAck
+ * This function is used to handle a received RequestChannelCloseAck
* response message.
* @param call Handle to the call.
* @param rccAck Pointer to the received ack response message.
(struct OOH323CallData *call, H245RequestChannelCloseAck *rccAck);
/**
- * Builds an OLC for faststart with an audio/video capability passed as
+ * Builds an OLC for faststart with an audio/video capability passed as
* parameter.
* @param call Handle to call for which OLC has to be built.
* @param olc Pointer to an OLC structure which will be populated.
- * @param epCap Pointer to the capability which will be used to
+ * @param epCap Pointer to the capability which will be used to
* build OLC.
- * @param pctxt Pointer to an OOCTXT structure which will be used
+ * @param pctxt Pointer to an OOCTXT structure which will be used
* to allocate additional memory for OLC.
* @param dir Direction of OLC
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooBuildFastStartOLC(struct OOH323CallData *call,
- H245OpenLogicalChannel *olc,
- ooH323EpCapability *epCap,
+EXTERN int ooBuildFastStartOLC(struct OOH323CallData *call,
+ H245OpenLogicalChannel *olc,
+ ooH323EpCapability *epCap,
OOCTXT*pctxt, int dir);
/**
* of the olc received in SETUP.
* @param call Handle to call for which OLC has to be built.
* @param olc Pointer to an received OLC structure.
- * @param epCap Pointer to the capability which will be used for
+ * @param epCap Pointer to the capability which will be used for
* this channel.
- * @param pctxt Pointer to an OOCTXT structure which will be used
+ * @param pctxt Pointer to an OOCTXT structure which will be used
* to allocate additional memory for OLC.
* @param dir Direction of channel OORX, OOTX etc.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooPrepareFastStartResponseOLC
- (OOH323CallData *call, H245OpenLogicalChannel *olc,
+ (OOH323CallData *call, H245OpenLogicalChannel *olc,
ooH323EpCapability *epCap, OOCTXT*pctxt, int dir);
/**
/**
* This function is used to send a terminal capability set reject message
* to the remote endpoint.
- * @param call Handle to the call for which reject message has to
+ * @param call Handle to the call for which reject message has to
* be sent.
* @param seqNo Sequence number of the TCS message to be rejected.
* @param cause Cause for rejecting a TCS message.
/**
* This function is used to send a TerminalCapabilitySetRelease message after
* capability exchange timer has expired.
- * @param call Handle to call for which release message has to be
+ * @param call Handle to call for which release message has to be
* sent.
*
* @return OO_OK, on success; OO_FAILED, on failure.
/**
- * This is an helper function used to extract ip address and port info from
+ * This is an helper function used to extract ip address and port info from
* H245TransportAddress structure.
* @param call Handle to associated call.
- * @param h245Address Handle to H245TransportAddress structure from which
+ * @param h245Address Handle to H245TransportAddress structure from which
* information has to be extracted.
- * @param ip Pointer to buffer in which ip address will be
+ * @param ip Pointer to buffer in which ip address will be
* returned. Make sure that buffer has sufficient length.
- * @param port Pointer to integer in which port number will be
+ * @param port Pointer to integer in which port number will be
* returned.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
int ooGetIpPortFromH245TransportAddress
- (OOH323CallData *call, H245TransportAddress *h245Address, char *ip,
+ (OOH323CallData *call, H245TransportAddress *h245Address, char *ip,
int *port);
/**
- * This is a callback function for handling an expired master-slave
+ * This is a callback function for handling an expired master-slave
* determination timer.
- * @param data Callback data registered at the time of creation of
+ * @param data Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
int ooMSDTimerExpired(void *data);
/**
- * This is a callback function for handling an expired capability exchange
+ * This is a callback function for handling an expired capability exchange
* timer.
- * @param data Callback data registered at the time of creation of
+ * @param data Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
int ooTCSTimerExpired(void *data);
/**
- * This is a callback function for handling an expired OpenLogicalChannel
+ * This is a callback function for handling an expired OpenLogicalChannel
* timer.
- * @param pdata Callback data registered at the time of creation of
+ * @param pdata Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
int ooOpenLogicalChannelTimerExpired(void *pdata);
/**
- * This is a callback function for handling an expired CloseLogicalChannel
+ * This is a callback function for handling an expired CloseLogicalChannel
* timer.
- * @param pdata Callback data registered at the time of creation of
+ * @param pdata Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
int ooCloseLogicalChannelTimerExpired(void *pdata);
/**
- * This is a callback function for handling an expired RequestChannelClose
+ * This is a callback function for handling an expired RequestChannelClose
* timer.
- * @param pdata Callback data registered at the time of creation of
+ * @param pdata Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
/**
* This is a callback function for handling an expired EndSession timer.
- * @param pdata Callback data registered at the time of creation of
+ * @param pdata Callback data registered at the time of creation of
* the timer.
*
* @return OO_OK, on success. OO_FAILED, otherwise.
*/
int ooSessionTimerExpired(void *pdata);
-/**
- * @}
+/**
+ * @}
*/
int ooRTDTimerExpired(void *pdata);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
if(pDisplayIE) {
if (call->remoteDisplayName)
memFreePtr(call->pctxt, call->remoteDisplayName);
- call->remoteDisplayName = (char *) memAllocZ(call->pctxt,
+ call->remoteDisplayName = (char *) memAllocZ(call->pctxt,
pDisplayIE->length*sizeof(ASN1OCTET)+1);
strncpy(call->remoteDisplayName, (char *)pDisplayIE->data, pDisplayIE->length*sizeof(ASN1OCTET));
}
if (!call->h225version && (protocolIdentifier->numids >= 6) &&
(protocolIdentifier->subid[3] == 2250)) {
call->h225version = protocolIdentifier->subid[5];
- OOTRACEDBGC4("Extract H.225 remote version, it's %d, (%s, %s)\n", call->h225version,
+ OOTRACEDBGC4("Extract H.225 remote version, it's %d, (%s, %s)\n", call->h225version,
call->callType, call->callToken);
}
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
ooLogicalChannel * pChannel = NULL;
- H245H2250LogicalChannelParameters * h2250lcp = NULL;
+ H245H2250LogicalChannelParameters * h2250lcp = NULL;
int i=0, ret=0;
/* Handle fast-start */
{
olc = NULL;
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, facility->fastStart.elem[i].data,
+ memcpy(msgbuf, facility->fastStart.elem[i].data,
facility->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
facility->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
{
OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "
"(%s, %s)\n",
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
{
OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
- "Number from %d to %d (%s, %s)\n",
- pChannel->channelNo,
- olc->forwardLogicalChannelNumber, call->callType,
+ "Number from %d to %d (%s, %s)\n",
+ pChannel->channelNo,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
pChannel->channelNo = olc->forwardLogicalChannelNumber;
}
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
+ "channel %d (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- ret = ooGetIpPortFromH245TransportAddress(call,
+ ret = ooGetIpPortFromH245TransportAddress(call,
&h2250lcp->mediaChannel, pChannel->remoteIP,
&pChannel->remoteMediaPort);
-
+
if(ret != OO_OK)
{
if(call->callState < OO_CALL_CLEAR)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
-
+
if(!pChannel->chanCap->startTransmitChannel)
{
OOTRACEERR3("ERROR:No callback registered to start transmit "
- "channel (%s, %s)\n",call->callType,
+ "channel (%s, %s)\n",call->callType,
call->callToken);
return OO_FAILED;
}
pChannel->chanCap->startTransmitChannel(call, pChannel);
}
- /* Mark the current channel as established and close all other
+ /* Mark the current channel as established and close all other
logical channels with same session id and in same direction.
*/
ooOnLogicalChannelEstablished(call, pChannel);
removeEventHandler(call->pctxt);
OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
}
-
+
}
if(facility->m.h245AddressPresent)
{
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
- "provided in facility message (%s, %s)\n",
+ "provided in facility message (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooH323GetIpPortFromH225TransportAddress(call,
+ ret = ooH323GetIpPortFromH225TransportAddress(call,
&facility->h245Address, call->remoteIP,
&call->remoteH245Port);
if(ret != OO_OK)
{
OOTRACEERR3("Error: Unknown H245 address type in received "
- "Facility message (%s, %s)", call->callType,
+ "Facility message (%s, %s)", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
if(call->remoteH245Port != 0 && !call->pH245Channel) {
- /* Create an H.245 connection.
+ /* Create an H.245 connection.
*/
if(ooCreateH245Connection(call)== OO_FAILED)
{
- OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
+ OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
{
cause = q931Msg->causeIE->data[1];
/* Get rid of the extension bit.For more info, check ooQ931SetCauseIE */
- cause = cause & 0x7f;
- OOTRACEDBGA4("Cause of Release Complete is %x. (%s, %s)\n", cause,
+ cause = cause & 0x7f;
+ OOTRACEDBGA4("Cause of Release Complete is %x. (%s, %s)\n", cause,
call->callType, call->callToken);
}
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if(((ooTimerCallback*)pTimer->cbData)->timerType &
+ if(((ooTimerCallback*)pTimer->cbData)->timerType &
OO_SESSION_TIMER)
{
memFreePtr(call->pctxt, pTimer->cbData);
ooTimerDelete(call->pctxt, &call->timerList, pTimer);
- OOTRACEDBGC3("Deleted Session Timer. (%s, %s)\n",
+ OOTRACEDBGC3("Deleted Session Timer. (%s, %s)\n",
call->callType, call->callToken);
break;
}
}
-
+
if(!q931Msg->userInfo)
{
OOTRACEERR3("ERROR:No User-User IE in received ReleaseComplete message "
if(releaseComplete->m.reasonPresent)
{
- OOTRACEINFO4("Release complete reason code %d. (%s, %s)\n",
+ OOTRACEINFO4("Release complete reason code %d. (%s, %s)\n",
releaseComplete->reason.t, call->callType, call->callToken);
reasonCode = releaseComplete->reason.t;
}
}
if(call->callEndReason == OO_REASON_UNKNOWN)
- call->callEndReason = ooGetCallClearReasonFromCauseAndReasonCode(cause,
+ call->callEndReason = ooGetCallClearReasonFromCauseAndReasonCode(cause,
reasonCode);
call->q931cause = cause;
#if 0
" (%s, %s)\n", call->callType, call->callToken);
}
#endif
- if(call->h245SessionState != OO_H245SESSION_IDLE &&
+ if(call->h245SessionState != OO_H245SESSION_IDLE &&
call->h245SessionState != OO_H245SESSION_CLOSED)
{
ooCloseH245Connection(call);
char remoteIP[2+8*4+7] = "";
call->callReference = q931Msg->callReference;
-
+
if(!q931Msg->userInfo)
{
OOTRACEERR3("ERROR:No User-User IE in received SETUP message (%s, %s)\n",
return OO_FAILED;
}
ooHandleH2250ID(call, &setup->protocolIdentifier);
- memcpy(call->callIdentifier.guid.data, setup->callIdentifier.guid.data,
+ memcpy(call->callIdentifier.guid.data, setup->callIdentifier.guid.data,
setup->callIdentifier.guid.numocts);
call->callIdentifier.guid.numocts = setup->callIdentifier.guid.numocts;
-
+
memcpy(call->confIdentifier.data, setup->conferenceID.data,
setup->conferenceID.numocts);
call->confIdentifier.numocts = setup->conferenceID.numocts;
pDisplayIE = ooQ931GetIE(q931Msg, Q931DisplayIE);
if(pDisplayIE)
{
- call->remoteDisplayName = (char *) memAllocZ(call->pctxt,
+ call->remoteDisplayName = (char *) memAllocZ(call->pctxt,
pDisplayIE->length*sizeof(ASN1OCTET)+1);
strncpy(call->remoteDisplayName, (char *)pDisplayIE->data, pDisplayIE->length*sizeof(ASN1OCTET));
}
{
if(setup->sourceAddress.count>0)
{
- ooH323RetrieveAliases(call, &setup->sourceAddress,
+ ooH323RetrieveAliases(call, &setup->sourceAddress,
&call->remoteAliases);
pAlias = call->remoteAliases;
while(pAlias)
}
/* Extract, aliases used for us, if present. Also,
Populate calledPartyNumber from dialedDigits, if not yet populated using
- calledPartyNumber Q931 IE.
- */
+ calledPartyNumber Q931 IE.
+ */
if(setup->m.destinationAddressPresent)
{
if(setup->destinationAddress.count>0)
{
- ooH323RetrieveAliases(call, &setup->destinationAddress,
+ ooH323RetrieveAliases(call, &setup->destinationAddress,
&call->ourAliases);
pAlias = call->ourAliases;
while(pAlias)
}
break;
}
- pAlias = pAlias->next;
+ pAlias = pAlias->next;
}
}
}
}
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
}
-
+
/* Extract Remote IP address */
if(!setup->m.sourceCallSignalAddressPresent)
{
call->remotePort = setup->sourceCallSignalAddress.u.ip6Address->port;
} else if(setup->sourceCallSignalAddress.t == T_H225TransportAddress_ipAddress) {
ip = &setup->sourceCallSignalAddress.u.ipAddress->ip;
- sprintf(remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1],
+ sprintf(remoteIP, "%d.%d.%d.%d", ip->data[0], ip->data[1],
ip->data[2], ip->data[3]);
call->remotePort = setup->sourceCallSignalAddress.u.ipAddress->port;
} else {
return OO_FAILED;
}
}
-
+
/* check for fast start */
-
+
if(setup->m.fastStartPresent)
{
if(!OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART))
{
olc = NULL;
/* memset(msgbuf, 0, sizeof(msgbuf));*/
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
- OOTRACEERR3("ERROR:Memory - ooOnReceivedSetup - olc (%s, %s)\n",
+ OOTRACEERR3("ERROR:Memory - ooOnReceivedSetup - olc (%s, %s)\n",
call->callType, call->callToken);
/*Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, setup->fastStart.elem[i].data,
+ memcpy(msgbuf, setup->fastStart.elem[i].data,
setup->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
setup->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
ooLogicalChannel * pChannel = NULL;
- H245H2250LogicalChannelParameters * h2250lcp = NULL;
+ H245H2250LogicalChannelParameters * h2250lcp = NULL;
int i=0, ret=0;
if(!q931Msg->userInfo)
" (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- callProceeding =
+ callProceeding =
q931Msg->userInfo->h323_uu_pdu.h323_message_body.u.callProceeding;
if(callProceeding == NULL)
{
OOTRACEERR3("Error: Received CallProceeding message does not have "
- "CallProceeding UUIE (%s, %s)\n", call->callType,
+ "CallProceeding UUIE (%s, %s)\n", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
{
olc = NULL;
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, callProceeding->fastStart.elem[i].data,
+ memcpy(msgbuf, callProceeding->fastStart.elem[i].data,
callProceeding->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
callProceeding->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
{
OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "
"(%s, %s)\n",
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
{
OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
- "Number from %d to %d (%s, %s)\n",
- pChannel->channelNo,
- olc->forwardLogicalChannelNumber, call->callType,
+ "Number from %d to %d (%s, %s)\n",
+ pChannel->channelNo,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
pChannel->channelNo = olc->forwardLogicalChannelNumber;
}
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
+ "channel %d (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
- ret = ooGetIpPortFromH245TransportAddress(call,
+ ret = ooGetIpPortFromH245TransportAddress(call,
&h2250lcp->mediaChannel, pChannel->remoteIP,
&pChannel->remoteMediaPort);
-
+
if(ret != OO_OK)
{
if(call->callState < OO_CALL_CLEAR)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
-
+
if(!pChannel->chanCap->startTransmitChannel)
{
OOTRACEERR3("ERROR:No callback registered to start transmit "
- "channel (%s, %s)\n",call->callType,
+ "channel (%s, %s)\n",call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
}
pChannel->chanCap->startTransmitChannel(call, pChannel);
}
- /* Mark the current channel as established and close all other
+ /* Mark the current channel as established and close all other
logical channels with same session id and in same direction.
*/
ooOnLogicalChannelEstablished(call, pChannel);
removeEventHandler(call->pctxt);
OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
}
-
+
}
/* Retrieve tunneling info/H.245 control channel address from the connect msg */
- if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
+ if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
!q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
callProceeding->m.h245AddressPresent) {
OOTRACEINFO3("Tunneling and h245address provided."
- "Using Tunneling for H.245 messages (%s, %s)\n",
+ "Using Tunneling for H.245 messages (%s, %s)\n",
call->callType, call->callToken);
}
else if(callProceeding->m.h245AddressPresent)
{
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
- "provided in callProceeding message (%s, %s)\n",
+ "provided in callProceeding message (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooH323GetIpPortFromH225TransportAddress(call,
+ ret = ooH323GetIpPortFromH225TransportAddress(call,
&callProceeding->h245Address, call->remoteIP,
&call->remoteH245Port);
if(ret != OO_OK)
{
OOTRACEERR3("Error: Unknown H245 address type in received "
- "CallProceeding message (%s, %s)", call->callType,
+ "CallProceeding message (%s, %s)", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
if(call->remoteH245Port != 0 && !call->pH245Channel) {
- /* Create an H.245 connection.
+ /* Create an H.245 connection.
*/
if(ooCreateH245Connection(call)== OO_FAILED)
{
- OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
+ OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
ooLogicalChannel * pChannel = NULL;
- H245H2250LogicalChannelParameters * h2250lcp = NULL;
+ H245H2250LogicalChannelParameters * h2250lcp = NULL;
int i=0, ret=0;
ooHandleDisplayIE(call, q931Msg);
if(alerting == NULL)
{
OOTRACEERR3("Error: Received Alerting message does not have "
- "alerting UUIE (%s, %s)\n", call->callType,
+ "alerting UUIE (%s, %s)\n", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
{
olc = NULL;
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, alerting->fastStart.elem[i].data,
+ memcpy(msgbuf, alerting->fastStart.elem[i].data,
alerting->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
alerting->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
{
OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "
"(%s, %s)\n",
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
{
OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
- "Number from %d to %d (%s, %s)\n",
- pChannel->channelNo,
- olc->forwardLogicalChannelNumber, call->callType,
+ "Number from %d to %d (%s, %s)\n",
+ pChannel->channelNo,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
pChannel->channelNo = olc->forwardLogicalChannelNumber;
}
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
+ "channel %d (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
- ret = ooGetIpPortFromH245TransportAddress(call,
+ ret = ooGetIpPortFromH245TransportAddress(call,
&h2250lcp->mediaChannel, pChannel->remoteIP,
&pChannel->remoteMediaPort);
-
+
if(ret != OO_OK)
{
if(call->callState < OO_CALL_CLEAR)
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
-
+
if(!pChannel->chanCap->startTransmitChannel)
{
OOTRACEERR3("ERROR:No callback registered to start transmit "
- "channel (%s, %s)\n",call->callType,
+ "channel (%s, %s)\n",call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
return OO_FAILED;
}
pChannel->chanCap->startTransmitChannel(call, pChannel);
- /* Mark the current channel as established and close all other
+ /* Mark the current channel as established and close all other
logical channels with same session id and in same direction.
*/
ooOnLogicalChannelEstablished(call, pChannel);
finishPrint();
removeEventHandler(call->pctxt);
OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
- }
+ }
}
/* Retrieve tunneling info/H.245 control channel address from the connect msg */
- if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
+ if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
!q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
- if (alerting->m.h245AddressPresent)
+ if (alerting->m.h245AddressPresent)
OOTRACEINFO3("Tunneling and h245address provided."
- "Giving preference to Tunneling (%s, %s)\n",
+ "Giving preference to Tunneling (%s, %s)\n",
call->callType, call->callToken);
if (call->h225version >= 4) {
ret =ooSendTCSandMSD(call);
{
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
- "provided in Alerting message (%s, %s)\n",
+ "provided in Alerting message (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooH323GetIpPortFromH225TransportAddress(call,
+ ret = ooH323GetIpPortFromH225TransportAddress(call,
&alerting->h245Address, call->remoteIP,
&call->remoteH245Port);
if(ret != OO_OK)
{
OOTRACEERR3("Error: Unknown H245 address type in received "
- "Alerting message (%s, %s)", call->callType,
+ "Alerting message (%s, %s)", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
if(call->remoteH245Port != 0 && !call->pH245Channel) {
- /* Create an H.245 connection.
+ /* Create an H.245 connection.
*/
if(ooCreateH245Connection(call)== OO_FAILED)
{
- OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
+ OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
ooLogicalChannel * pChannel = NULL;
- H245H2250LogicalChannelParameters * h2250lcp = NULL;
+ H245H2250LogicalChannelParameters * h2250lcp = NULL;
int i=0, ret=0;
ooHandleDisplayIE(call, q931Msg);
if(progress == NULL)
{
OOTRACEERR3("Error: Received Progress message does not have "
- "progress UUIE (%s, %s)\n", call->callType,
+ "progress UUIE (%s, %s)\n", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
{
olc = NULL;
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, progress->fastStart.elem[i].data,
+ memcpy(msgbuf, progress->fastStart.elem[i].data,
progress->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
progress->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
{
OOTRACEERR4("ERROR: Logical Channel %d not found, fast start. "
"(%s, %s)\n",
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
if(pChannel->channelNo != olc->forwardLogicalChannelNumber)
{
OOTRACEINFO5("Remote endpoint changed forwardLogicalChannel"
- "Number from %d to %d (%s, %s)\n",
- pChannel->channelNo,
- olc->forwardLogicalChannelNumber, call->callType,
+ "Number from %d to %d (%s, %s)\n",
+ pChannel->channelNo,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
pChannel->channelNo = olc->forwardLogicalChannelNumber;
}
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
+ "channel %d (%s, %s)\n",
olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
- ret = ooGetIpPortFromH245TransportAddress(call,
+ ret = ooGetIpPortFromH245TransportAddress(call,
&h2250lcp->mediaChannel, pChannel->remoteIP,
&pChannel->remoteMediaPort);
-
+
if(ret != OO_OK)
{
if(call->callState < OO_CALL_CLEAR)
removeEventHandler(call->pctxt);
return OO_FAILED;
}
-
+
if(!pChannel->chanCap->startTransmitChannel)
{
OOTRACEERR3("ERROR:No callback registered to start transmit "
- "channel (%s, %s)\n",call->callType,
+ "channel (%s, %s)\n",call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
}
pChannel->chanCap->startTransmitChannel(call, pChannel);
}
- /* Mark the current channel as established and close all other
+ /* Mark the current channel as established and close all other
logical channels with same session id and in same direction.
*/
ooOnLogicalChannelEstablished(call, pChannel);
removeEventHandler(call->pctxt);
OO_SETFLAG(call->flags, OO_M_FASTSTARTANSWERED);
}
-
+
}
/* Retrieve the H.245 control channel address from the connect msg */
/* Retrieve tunneling info/H.245 control channel address from the connect msg */
- if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
+ if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
!q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
q931Msg->userInfo->h323_uu_pdu.h245Tunneling &&
OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
- if (progress->m.h245AddressPresent)
+ if (progress->m.h245AddressPresent)
OOTRACEINFO3("Tunneling and h245address provided."
- "Giving preference to Tunneling (%s, %s)\n",
+ "Giving preference to Tunneling (%s, %s)\n",
call->callType, call->callToken);
if (call->h225version >= 4) {
ret =ooSendTCSandMSD(call);
{
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
- "provided in Progress message (%s, %s)\n",
+ "provided in Progress message (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooH323GetIpPortFromH225TransportAddress(call,
+ ret = ooH323GetIpPortFromH225TransportAddress(call,
&progress->h245Address, call->remoteIP,
&call->remoteH245Port);
if(ret != OO_OK)
{
OOTRACEERR3("Error: Unknown H245 address type in received "
- "Progress message (%s, %s)", call->callType,
+ "Progress message (%s, %s)", call->callType,
call->callToken);
/* Mark call for clearing */
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
if(call->remoteH245Port != 0 && !call->pH245Channel) {
- /* Create an H.245 connection.
+ /* Create an H.245 connection.
*/
if(ooCreateH245Connection(call)== OO_FAILED)
{
- OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
+ OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
return OO_OK;
}
-
+
int ooOnReceivedSignalConnect(OOH323CallData* call, Q931Message *q931Msg)
{
H245OpenLogicalChannel* olc;
ASN1OCTET msgbuf[MAXMSGLEN];
ooLogicalChannel * pChannel = NULL;
- H245H2250LogicalChannelParameters * h2250lcp = NULL;
+ H245H2250LogicalChannelParameters * h2250lcp = NULL;
ooHandleDisplayIE(call, q931Msg);
}
ooHandleH2250ID(call, &connect->protocolIdentifier);
/*Handle fast-start */
- if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
+ if(OO_TESTFLAG (call->flags, OO_M_FASTSTART) &&
!OO_TESTFLAG (call->flags, OO_M_FASTSTARTANSWERED))
{
if(!connect->m.fastStartPresent)
}
}
- if (connect->m.fastStartPresent &&
+ if (connect->m.fastStartPresent &&
!OO_TESTFLAG(call->flags, OO_M_FASTSTARTANSWERED))
{
/* For printing the decoded message to log, initialize handler. */
{
olc = NULL;
/* memset(msgbuf, 0, sizeof(msgbuf));*/
- olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(call->pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- memcpy(msgbuf, connect->fastStart.elem[i].data,
+ memcpy(msgbuf, connect->fastStart.elem[i].data,
connect->fastStart.elem[i].numocts);
- setPERBuffer(call->pctxt, msgbuf,
+ setPERBuffer(call->pctxt, msgbuf,
connect->fastStart.elem[i].numocts, 1);
ret = asn1PD_H245OpenLogicalChannel(call->pctxt, olc);
if(ret != ASN_OK)
{
OOTRACEERR4("ERROR: Logical Channel %d not found, fasts start "
"answered. (%s, %s)\n",
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
finishPrint();
removeEventHandler(call->pctxt);
{
OOTRACEINFO5("Remote endpoint changed forwardLogicalChannelNumber"
"from %d to %d (%s, %s)\n", pChannel->channelNo,
- olc->forwardLogicalChannelNumber, call->callType,
+ olc->forwardLogicalChannelNumber, call->callType,
call->callToken);
pChannel->channelNo = olc->forwardLogicalChannelNumber;
}
if(!strcmp(pChannel->dir, "transmit"))
{
- if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
+ if(olc->forwardLogicalChannelParameters.multiplexParameters.t !=
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for channel"
- " %d (%s, %s)\n", olc->forwardLogicalChannelNumber,
+ " %d (%s, %s)\n", olc->forwardLogicalChannelNumber,
call->callType, call->callToken);
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
return OO_FAILED;
}
- ret = ooGetIpPortFromH245TransportAddress(call,
+ ret = ooGetIpPortFromH245TransportAddress(call,
&h2250lcp->mediaChannel, pChannel->remoteIP,
&pChannel->remoteMediaPort);
if(ret != OO_OK)
}
pChannel->chanCap->startTransmitChannel(call, pChannel);
}
- /* Mark the current channel as established and close all other
+ /* Mark the current channel as established and close all other
logical channels with same session id and in same direction.
*/
ooOnLogicalChannelEstablished(call, pChannel);
}
/* Retrieve tunneling info/H.245 control channel address from the connect msg */
- if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
+ if(q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent &&
!q931Msg->userInfo->h323_uu_pdu.h245Tunneling) {
if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) {
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
connect->m.h245AddressPresent) {
OOTRACEINFO3("Tunneling and h245address provided."
- "Giving preference to Tunneling (%s, %s)\n",
+ "Giving preference to Tunneling (%s, %s)\n",
call->callType, call->callToken);
}
else if(connect->m.h245AddressPresent)
{
OO_CLRFLAG (call->flags, OO_M_TUNNELING);
OOTRACEINFO3("Tunneling is disabled for call as H245 address is "
- "provided in connect message (%s, %s)\n",
+ "provided in connect message (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooH323GetIpPortFromH225TransportAddress(call,
+ ret = ooH323GetIpPortFromH225TransportAddress(call,
&connect->h245Address, call->remoteIP, &call->remoteH245Port);
if(ret != OO_OK)
{
if(call->remoteH245Port != 0 && !call->pH245Channel)
{
- /* Create an H.245 connection.
+ /* Create an H.245 connection.
*/
if(ooCreateH245Connection(call)== OO_FAILED)
{
- OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
+ OOTRACEERR3("Error: H.245 channel creation failed (%s, %s)\n",
call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
}
/*
- Send TCS as call established and no capability exchange has yet
+ Send TCS as call established and no capability exchange has yet
started. This will be true only when separate h245 connection is not
established and tunneling is being used.
*/
if (call->rtdrCount > 0 && call->rtdrInterval > 0) {
return ooSendRoundTripDelayRequest(call);
}
- return OO_OK;
+ return OO_OK;
}
int ooHandleH2250Message(OOH323CallData *call, Q931Message *q931Msg)
if (ret != OO_OK) {
call->callState = OO_CALL_CLEAR;
} else {
-
+
/* H225 message callback */
if(gH323ep.h225Callbacks.onReceivedSetup)
ret = gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg);
}
- /* Free up the mem used by the received message, as it's processing
- is done.
+ /* Free up the mem used by the received message, as it's processing
+ is done.
*/
if (ret == OO_OK) {
ooFreeQ931Message(call->msgctxt, q931Msg);
-
- /* DISABLEGK is used to selectively disable gatekeeper use. For
- incoming calls DISABLEGK can be set in onReceivedSetup callback by
- application. Very useful in pbx applications where gk is used only
+
+ /* DISABLEGK is used to selectively disable gatekeeper use. For
+ incoming calls DISABLEGK can be set in onReceivedSetup callback by
+ application. Very useful in pbx applications where gk is used only
when call is to or from outside pbx domian
*/
if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK))
{
call->callState = OO_CALL_WAITING_ADMISSION;
ast_mutex_lock(&call->GkLock);
- ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call,
+ ret = ooGkClientSendAdmissionRequest(gH323ep.gkClient, call,
FALSE);
tv = ast_tvnow();
ts.tv_sec = tv.tv_sec + 24;
case Q931AlertingMsg:/* ALERTING message received */
- OOTRACEINFO3("H.225 Alerting message received (%s, %s)\n",
+ OOTRACEINFO3("H.225 Alerting message received (%s, %s)\n",
call->callType, call->callToken);
call->alertingTime = (H235TimeStamp) time(NULL);
case Q931ProgressMsg:/* PROGRESS message received */
- OOTRACEINFO3("H.225 Progress message received (%s, %s)\n",
+ OOTRACEINFO3("H.225 Progress message received (%s, %s)\n",
call->callType, call->callToken);
ooOnReceivedProgress(call, q931Msg);
{
pNode = dListFindByIndex(&call->timerList, i);
pTimer = (OOTimer*)pNode->data;
- if(((ooTimerCallback*)pTimer->cbData)->timerType &
+ if(((ooTimerCallback*)pTimer->cbData)->timerType &
OO_CALLESTB_TIMER)
{
memFreePtr(call->pctxt, pTimer->cbData);
ooTimerDelete(call->pctxt, &call->timerList, pTimer);
- OOTRACEDBGC3("Deleted CallESTB timer. (%s, %s)\n",
+ OOTRACEDBGC3("Deleted CallESTB timer. (%s, %s)\n",
call->callType, call->callToken);
break;
}
call->endTime = (H235TimeStamp) time(NULL);
ooOnReceivedReleaseComplete(call, q931Msg);
-
+
ooFreeQ931Message(call->msgctxt, q931Msg);
break;
- case Q931FacilityMsg:
+ case Q931FacilityMsg:
OOTRACEINFO3("H.225 Facility message Received (%s, %s)\n",
call->callType, call->callToken);
- ooOnReceivedFacility(call, q931Msg);
+ ooOnReceivedFacility(call, q931Msg);
ooFreeQ931Message(call->msgctxt, q931Msg);
break;
case Q931StatusMsg:
call->callType, call->callToken);
ooFreeQ931Message(call->msgctxt, q931Msg);
break;
- case Q931NotifyMsg:
+ case Q931NotifyMsg:
OOTRACEINFO3("H.225 Notify message Received (%s, %s)\n",
call->callType, call->callToken);
ooFreeQ931Message(call->msgctxt, q931Msg);
int ret;
H225TransportAddress_ipAddress_ip *ip = NULL;
H225TransportAddress_ip6Address_ip *ip6 = NULL;
- OOTRACEDBGC3("Received Facility Message.(%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Received Facility Message.(%s, %s)\n", call->callType,
call->callToken);
ooHandleDisplayIE(call, pQ931Msg);
{
OOTRACEINFO3("Call Forward Facility message received. (%s, %s)\n",
call->callType, call->callToken);
- if(!facility->m.alternativeAddressPresent &&
+ if(!facility->m.alternativeAddressPresent &&
!facility->m.alternativeAliasAddressPresent)
{
OOTRACEERR3("Error:No alternative address provided in call forward"
- "facility message.(%s, %s)\n", call->callType,
+ "facility message.(%s, %s)\n", call->callType,
call->callToken);
if(call->callState < OO_CALL_CLEAR)
{
}
return OO_OK;
}
- call->pCallFwdData = (OOCallFwdData *) memAlloc(call->pctxt,
+ call->pCallFwdData = (OOCallFwdData *) memAlloc(call->pctxt,
sizeof(OOCallFwdData));
if(!call->pCallFwdData)
{
if(facility->m.alternativeAddressPresent)
{
if (call->versionIP == 6) {
- if(facility->alternativeAddress.t !=
+ if(facility->alternativeAddress.t !=
T_H225TransportAddress_ip6Address)
{
OOTRACEERR3("ERROR: Source call signalling address type not ip6 "
"(%s, %s)\n", call->callType, call->callToken);
-
+
return OO_FAILED;
}
ip6 = &facility->alternativeAddress.u.ip6Address->ip;
inet_ntop(AF_INET6, ip6->data, call->pCallFwdData->ip, INET6_ADDRSTRLEN);
- call->pCallFwdData->port =
+ call->pCallFwdData->port =
facility->alternativeAddress.u.ip6Address->port;
} else {
- if(facility->alternativeAddress.t !=
+ if(facility->alternativeAddress.t !=
T_H225TransportAddress_ipAddress)
{
OOTRACEERR3("ERROR: Source call signalling address type not ip "
"(%s, %s)\n", call->callType, call->callToken);
-
+
return OO_FAILED;
}
ip = &facility->alternativeAddress.u.ipAddress->ip;
- sprintf(call->pCallFwdData->ip, "%d.%d.%d.%d", ip->data[0],
+ sprintf(call->pCallFwdData->ip, "%d.%d.%d.%d", ip->data[0],
ip->data[1], ip->data[2], ip->data[3]);
- call->pCallFwdData->port =
+ call->pCallFwdData->port =
facility->alternativeAddress.u.ipAddress->port;
}
}
if(facility->m.alternativeAliasAddressPresent)
{
- ooH323RetrieveAliases(call, &facility->alternativeAliasAddress,
+ ooH323RetrieveAliases(call, &facility->alternativeAliasAddress,
&call->pCallFwdData->aliases);
}
/* Now we have to clear the current call and make a new call to
}
}
else{
- OOTRACEINFO3("Unhandled Facility reason type received (%s, %s)\n",
+ OOTRACEINFO3("Unhandled Facility reason type received (%s, %s)\n",
call->callType, call->callToken);
}
}
else{ /* Empty facility message Check for tunneling */
- if (pH323UUPdu->h323_message_body.t ==
+ if (pH323UUPdu->h323_message_body.t ==
T_H225H323_UU_PDU_h323_message_body_empty) {
OOTRACEDBGB3("Handling tunneled messages in empty Facility message."
" (%s, %s)\n", call->callType, call->callToken);
"message. (%s, %s)\n", call->callType, call->callToken);
}
}
-
+
return OO_OK;
}
H225TransportAddress_ipAddress *ipAddress = NULL;
H225TransportAddress_ip6Address *ip6Address = NULL;
int ret;
-
+
/* Extract H245 address */
if(!facility->m.h245AddressPresent)
{
"address found. (%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
-
+
sprintf(call->remoteIP, "%d.%d.%d.%d", ipAddress->ip.data[0],
ipAddress->ip.data[1],
ipAddress->ip.data[2],
H245Message *pmsg;
OOCTXT *pctxt = call->msgctxt;
int ret=0,i=0;
-
- OOTRACEDBGC3("Checking for tunneled H.245 messages (%s, %s)\n",
+
+ OOTRACEDBGC3("Checking for tunneled H.245 messages (%s, %s)\n",
call->callType, call->callToken);
- /* Check whether there are tunneled messages */
+ /* Check whether there are tunneled messages */
if(pH323UUPdu->m.h245TunnelingPresent)
{
if(pH323UUPdu->h245Tunneling)
{
OOTRACEDBGB4("Total number of tunneled H245 messages are %d.(%s, %s)"
- "\n", (int)pH323UUPdu->h245Control.n, call->callType,
+ "\n", (int)pH323UUPdu->h245Control.n, call->callType,
call->callToken);
for(i=0; i< (int)pH323UUPdu->h245Control.n; i++)
{
return OO_FAILED;
}
- setPERBuffer(pctxt,
+ setPERBuffer(pctxt,
(ASN1OCTET*)pH323UUPdu->h245Control.elem[i].data,
- pH323UUPdu->h245Control.elem[i].numocts, 1);
+ pH323UUPdu->h245Control.elem[i].numocts, 1);
initializePrintHandler(&printHandler, "Tunneled H.245 Message");
memset(pmsg, 0, sizeof(H245Message));
/* Set event handler */
setEventHandler (pctxt, &printHandler);
- OOTRACEDBGC4("Decoding %d tunneled H245 message. (%s, %s)\n",
+ OOTRACEDBGC4("Decoding %d tunneled H245 message. (%s, %s)\n",
i+1, call->callType, call->callToken);
- ret = asn1PD_H245MultimediaSystemControlMessage(pctxt,
+ ret = asn1PD_H245MultimediaSystemControlMessage(pctxt,
&(pmsg->h245Msg));
if(ret != ASN_OK)
{
- OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
+ OOTRACEERR3("Error decoding H245 message (%s, %s)\n",
call->callType, call->callToken);
ooFreeH245Message(call,pmsg);
return OO_FAILED;
}
int ooH323RetrieveAliases
- (OOH323CallData *call, H225_SeqOfH225AliasAddress *pAddresses,
+ (OOH323CallData *call, H225_SeqOfH225AliasAddress *pAddresses,
OOAliases **aliasList)
{
int i=0,j=0,k=0;
if(!pAddresses)
{
- OOTRACEWARN3("Warn:No Aliases present (%s, %s)\n", call->callType,
+ OOTRACEWARN3("Warn:No Aliases present (%s, %s)\n", call->callType,
call->callToken);
return OO_OK;
}
/* check for aliases */
if(pAddresses->count<=0)
return OO_OK;
-
+
for(i=0; i<(int)pAddresses->count; i++)
{
pNode = dListFindByIndex (pAddresses, i);
{
case T_H225AliasAddress_dialedDigits:
newAlias->type = T_H225AliasAddress_dialedDigits;
- newAlias->value = (char*) memAlloc(call->pctxt,
+ newAlias->value = (char*) memAlloc(call->pctxt,
strlen(pAliasAddress->u.dialedDigits)*sizeof(char)+1);
if(!newAlias->value)
{
OOTRACEERR3("ERROR:Memory - ooH323RetrieveAliases - "
- "newAlias->value(dialedDigits) (%s, %s)\n",
+ "newAlias->value(dialedDigits) (%s, %s)\n",
call->callType, call->callToken);
- memFreePtr(call->pctxt, newAlias);
+ memFreePtr(call->pctxt, newAlias);
return OO_FAILED;
}
break;
case T_H225AliasAddress_h323_ID:
newAlias->type = T_H225AliasAddress_h323_ID;
- newAlias->value = (char*)memAlloc(call->pctxt,
+ newAlias->value = (char*)memAlloc(call->pctxt,
(pAliasAddress->u.h323_ID.nchars+1)*sizeof(char)+1);
if(!newAlias->value)
{
OOTRACEERR3("ERROR:Memory - ooH323RetrieveAliases - "
- "newAlias->value(h323id) (%s, %s)\n", call->callType,
+ "newAlias->value(h323id) (%s, %s)\n", call->callType,
call->callToken);
- memFreePtr(call->pctxt, newAlias);
+ memFreePtr(call->pctxt, newAlias);
return OO_FAILED;
}
}
}
newAlias->value[k] = '\0';
- break;
+ break;
case T_H225AliasAddress_url_ID:
newAlias->type = T_H225AliasAddress_url_ID;
newAlias->value = (char*)memAlloc(call->pctxt,
if(!newAlias->value)
{
OOTRACEERR3("ERROR:Memory - ooH323RetrieveAliases - "
- "newAlias->value(urlid) (%s, %s)\n", call->callType,
+ "newAlias->value(urlid) (%s, %s)\n", call->callType,
call->callToken);
- memFreePtr(call->pctxt, newAlias);
+ memFreePtr(call->pctxt, newAlias);
return OO_FAILED;
}
newAlias->type = T_H225AliasAddress_transportID;
pTransportAddrss = pAliasAddress->u.transportID;
if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) {
- /* hopefully ip:port value can't exceed more than 30
+ /* hopefully ip:port value can't exceed more than 30
characters */
- newAlias->value = (char*)memAlloc(call->pctxt,
+ newAlias->value = (char*)memAlloc(call->pctxt,
INET6_ADDRSTRLEN*sizeof(char)*2);
inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN);
sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port);
} else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) {
- /* hopefully ip:port value can't exceed more than 30
+ /* hopefully ip:port value can't exceed more than 30
characters */
- newAlias->value = (char*)memAlloc(call->pctxt,
+ newAlias->value = (char*)memAlloc(call->pctxt,
30*sizeof(char));
- sprintf(newAlias->value, "%d.%d.%d.%d:%d",
+ sprintf(newAlias->value, "%d.%d.%d.%d:%d",
pTransportAddrss->u.ipAddress->ip.data[0],
pTransportAddrss->u.ipAddress->ip.data[1],
pTransportAddrss->u.ipAddress->ip.data[2],
break;
case T_H225AliasAddress_email_ID:
newAlias->type = T_H225AliasAddress_email_ID;
- newAlias->value = (char*)memAlloc(call->pctxt,
+ newAlias->value = (char*)memAlloc(call->pctxt,
strlen(pAliasAddress->u.email_ID)*sizeof(char)+1);
if(!newAlias->value)
{
OOTRACEERR3("ERROR:Memory - ooH323RetrieveAliases - "
- "newAlias->value(emailid) (%s, %s)\n", call->callType,
+ "newAlias->value(emailid) (%s, %s)\n", call->callType,
call->callToken);
- memFreePtr(call->pctxt, newAlias);
+ memFreePtr(call->pctxt, newAlias);
return OO_FAILED;
}
newAlias->value[strlen(pAliasAddress->u.email_ID)*sizeof(char)]='\0';
break;
default:
- OOTRACEERR3("Error:Unhandled Alias type (%s, %s)\n",
+ OOTRACEERR3("Error:Unhandled Alias type (%s, %s)\n",
call->callType, call->callToken);
memFreePtr(call->pctxt, newAlias);
continue;
*aliasList = newAlias;
newAlias = NULL;
-
+
pAliasAddress = NULL;
pNode = NULL;
}/* endof: for */
switch(pAlias->type)
{
case T_H225AliasAddress_dialedDigits:
- pPrefixEntry = (H225SupportedPrefix *)memAlloc(pctxt,
+ pPrefixEntry = (H225SupportedPrefix *)memAlloc(pctxt,
sizeof(H225SupportedPrefix));
if(!pPrefixEntry) {
OOTRACEERR1("ERROR:Memory - ooPopulatePrefixList - pAliasEntry\n");
bValid = TRUE;
break;
default:
- bValid = FALSE;
+ bValid = FALSE;
}
-
+
if(bValid)
dListAppend( pctxt, pPrefixList, (void*)pPrefixEntry );
-
+
pAlias = pAlias->next;
}
}
pAlias = pAlias->next;
continue;
}
- pAliasEntry = (H225AliasAddress*)memAlloc(pctxt,
+ pAliasEntry = (H225AliasAddress*)memAlloc(pctxt,
sizeof(H225AliasAddress));
if(!pAliasEntry)
{
pAliasEntry->u.h323_ID.nchars = strlen(pAlias->value);
pAliasEntry->u.h323_ID.data = (ASN116BITCHAR*)memAllocZ
(pctxt, strlen(pAlias->value)*sizeof(ASN116BITCHAR));
-
+
if(!pAliasEntry->u.h323_ID.data)
{
OOTRACEERR1("ERROR:Memory - ooPopulateAliasList - h323_id\n");
break;
case T_H225AliasAddress_url_ID:
pAliasEntry->t = T_H225AliasAddress_url_ID;
- pAliasEntry->u.url_ID = (ASN1IA5String)memAlloc(pctxt,
+ pAliasEntry->u.url_ID = (ASN1IA5String)memAlloc(pctxt,
strlen(pAlias->value)+1);
if(!pAliasEntry->u.url_ID)
{
OOTRACEERR1("ERROR:Memory - ooPopulateAliasList - url_id\n");
- memFreePtr(pctxt, pAliasEntry);
+ memFreePtr(pctxt, pAliasEntry);
return OO_FAILED;
}
strcpy(*(char**)&pAliasEntry->u.url_ID, pAlias->value);
break;
case T_H225AliasAddress_email_ID:
pAliasEntry->t = T_H225AliasAddress_email_ID;
- pAliasEntry->u.email_ID = (ASN1IA5String)memAlloc(pctxt,
+ pAliasEntry->u.email_ID = (ASN1IA5String)memAlloc(pctxt,
strlen(pAlias->value)+1);
if(!pAliasEntry->u.email_ID)
{
break;
default:
OOTRACEERR1("ERROR: Unhandled alias type\n");
- bValid = FALSE;
+ bValid = FALSE;
}
-
+
if(bValid)
dListAppend( pctxt, pAliasList, (void*)pAliasEntry );
else
memFreePtr(pctxt, pAliasEntry);
-
+
pAlias = pAlias->next;
}
}
int j=0,k=0;
OOAliases *newAlias=NULL;
H225TransportAddress *pTransportAddrss=NULL;
-
+
newAlias = (OOAliases*) memAlloc(pctxt, sizeof(OOAliases));
if(!newAlias)
{
break;
case T_H225AliasAddress_h323_ID:
newAlias->type = T_H225AliasAddress_h323_ID;
- newAlias->value = (char*)memAlloc(pctxt,
+ newAlias->value = (char*)memAlloc(pctxt,
(pAliasAddress->u.h323_ID.nchars+1)*sizeof(char)+1);
for(j=0, k=0; j<(int)pAliasAddress->u.h323_ID.nchars; j++)
}
}
newAlias->value[k] = '\0';
- break;
+ break;
case T_H225AliasAddress_url_ID:
newAlias->type = T_H225AliasAddress_url_ID;
newAlias->value = (char*)memAlloc(pctxt,
newAlias->type = T_H225AliasAddress_transportID;
pTransportAddrss = pAliasAddress->u.transportID;
if(pTransportAddrss->t == T_H225TransportAddress_ip6Address) {
- /* hopefully ip:port value can't exceed more than 30
+ /* hopefully ip:port value can't exceed more than 30
characters */
- newAlias->value = (char*)memAlloc(pctxt,
+ newAlias->value = (char*)memAlloc(pctxt,
INET6_ADDRSTRLEN*sizeof(char)*2);
inet_ntop(AF_INET6, pTransportAddrss->u.ip6Address->ip.data, newAlias->value, INET6_ADDRSTRLEN);
sprintf(newAlias->value+strlen(newAlias->value), ":%d", pTransportAddrss->u.ip6Address->port);
} else if(pTransportAddrss->t == T_H225TransportAddress_ipAddress) {
- /* hopefully ip:port value can't exceed more than 30
+ /* hopefully ip:port value can't exceed more than 30
characters */
- newAlias->value = (char*)memAlloc(pctxt,
+ newAlias->value = (char*)memAlloc(pctxt,
30*sizeof(char));
- sprintf(newAlias->value, "%d.%d.%d.%d:%d",
+ sprintf(newAlias->value, "%d.%d.%d.%d:%d",
pTransportAddrss->u.ipAddress->ip.data[0],
pTransportAddrss->u.ipAddress->ip.data[1],
pTransportAddrss->u.ipAddress->ip.data[2],
break;
case T_H225AliasAddress_email_ID:
newAlias->type = T_H225AliasAddress_email_ID;
- newAlias->value = (char*)memAlloc(pctxt,
+ newAlias->value = (char*)memAlloc(pctxt,
strlen(pAliasAddress->u.email_ID)*sizeof(char)+1);
strcpy(newAlias->value, pAliasAddress->u.email_ID);
return newAlias;
}
-int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call,
+int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call,
H225TransportAddress *h225Address, char *ip, int *port)
{
if (call->versionIP == 6) {
call->callToken);
return OO_FAILED;
}
- sprintf(ip, "%d.%d.%d.%d",
- h225Address->u.ipAddress->ip.data[0],
+ sprintf(ip, "%d.%d.%d.%d",
+ h225Address->u.ipAddress->ip.data[0],
h225Address->u.ipAddress->ip.data[1],
h225Address->u.ipAddress->ip.data[2],
h225Address->u.ipAddress->ip.data[3]);
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooh323.h
- * This file contains functions to support H.225 messages.
+ * @file ooh323.h
+ * This file contains functions to support H.225 messages.
*/
#ifndef _OOH323HDR_H_
#define _OOH323HDR_H_
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooHandleTunneledH245Messages(struct OOH323CallData *call,
+EXTERN int ooHandleTunneledH245Messages(struct OOH323CallData *call,
H225H323_UU_PDU * pH323UUPdu);
/**
* @param call Handle to the call
* @param facility Pointer to the facility message.
*/
-EXTERN int ooHandleStartH245FacilityMessage(struct OOH323CallData *call,
+EXTERN int ooHandleStartH245FacilityMessage(struct OOH323CallData *call,
H225Facility_UUIE *facility);
/**
* @param call Handle to the call.Null when retrieving registered
* aliases.
* @param pAddresses Pointer to the sequence of alias addresses.
- * @param aliasList Handle to alias list to be populated with retrieved
+ * @param aliasList Handle to alias list to be populated with retrieved
* aliases.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323RetrieveAliases
- (struct OOH323CallData *call, H225_SeqOfH225AliasAddress *pAddresses,
+ (struct OOH323CallData *call, H225_SeqOfH225AliasAddress *pAddresses,
OOAliases **aliasList);
/**
* @param pAliases Pointer to aliases to be used for populating list.
* @param pAliasList Pointer to alias list to be populated.
*
- * @return OO_OK, on success. OO_FAILED, otherwise.
+ * @return OO_OK, on success. OO_FAILED, otherwise.
*/
EXTERN int ooPopulateAliasList(OOCTXT *pctxt, OOAliases *pAliases,
- H225_SeqOfH225AliasAddress *pAliasList, int pAliasType);
+ H225_SeqOfH225AliasAddress *pAliasList, int pAliasType);
/**
* This function is used to search a particular alias in the alias list. The
* search can be on the basis of alias type or value or both.
* @param aliasList Handle to the alias list to be searched.
- * @param type Type of the alias, if search has to consider type as
+ * @param type Type of the alias, if search has to consider type as
* criterion, otherwise 0.
* @param value Value of the alias, if the search has to consider value as
* criterion, NULL otherwise.
/**
* This function is used to add a new alias to alias list.
* @param pAliasList Pointer to Alias list.
- * @param pctxt Pointer to OOCTXT structure to be used for memory
+ * @param pctxt Pointer to OOCTXT structure to be used for memory
* allocation.
* @param pAliasAddress New alias address to be added.
*
* @param h225Address Pointer to H225TransportAddress structure
* @param ip Pointer to the buffer in which dotted ip address will
* be returned.
- * @param port Pointer to the integer in which port value will be
+ * @param port Pointer to the integer in which port value will be
* returned.
*
* @return OO_OK, on success; OO_FAILED, on failure.
*/
-int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call,
+int ooH323GetIpPortFromH225TransportAddress(struct OOH323CallData *call,
H225TransportAddress *h225Address, char *ip, int *port);
/**
* @}
#endif
#endif
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
int ooH323EpInitialize
(enum OOCallMode callMode, const char* tracefile)
{
-
+
memset(&gH323ep, 0, sizeof(ooEndPoint));
initContext(&(gH323ep.ctxt));
{
if(strlen(tracefile)>= MAXFILENAME)
{
- printf("Error:File name longer than allowed maximum %d\n",
+ printf("Error:File name longer than allowed maximum %d\n",
MAXFILENAME-1);
return OO_FAILED;
}
strcpy(gH323ep.traceFile, tracefile);
}
else{
- strcpy(gH323ep.traceFile, DEFAULT_TRACEFILE);
+ strcpy(gH323ep.traceFile, DEFAULT_TRACEFILE);
}
gH323ep.fptraceFile = fopen(gH323ep.traceFile, "a");
if(gH323ep.fptraceFile == NULL)
{
- printf("Error:Failed to open trace file %s for write.\n",
+ printf("Error:Failed to open trace file %s for write.\n",
gH323ep.traceFile);
return OO_FAILED;
}
- /* Initialize default port ranges that will be used by stack.
+ /* Initialize default port ranges that will be used by stack.
Apps can override these by explicitely setting port ranges
*/
gH323ep.rtpPorts.start = RTPPORTSSTART;
gH323ep.rtpPorts.max = RTPPORTSEND;
gH323ep.rtpPorts.current = RTPPORTSSTART;
-
+
OO_SETFLAG(gH323ep.flags, OO_M_FASTSTART);
OO_SETFLAG(gH323ep.flags, OO_M_TUNNELING);
OO_SETFLAG(gH323ep.flags, OO_M_AUTOANSWER);
OO_CLRFLAG(gH323ep.flags, OO_M_GKROUTED);
-
+
gH323ep.aliases = NULL;
gH323ep.termType = DEFAULT_TERMTYPE;
ooH323EpSetCallerID(DEFAULT_CALLERID);
-
+
gH323ep.myCaps = NULL;
gH323ep.noOfCaps = 0;
gH323ep.callList = NULL;
ast_mutex_init(&newCallLock);
ast_mutex_init(&bindPortLock);
gH323ep.dtmfmode = 0;
- gH323ep.callingPartyNumber[0]='\0';
+ gH323ep.callingPartyNumber[0]='\0';
gH323ep.callMode = callMode;
gH323ep.isGateway = FALSE;
strcpy(gH323ep.signallingIP, localip);
OOTRACEINFO2("Signalling IP address is set to %s\n", localip);
}
-
+
if(listenport)
{
gH323ep.listenPort = listenport;
return OO_OK;
}
-
+
int ooH323EpSetH323Callbacks(OOH323CALLBACKS h323Callbacks)
{
gH323ep.h323Callbacks.onNewCallCreated = h323Callbacks.onNewCallCreated;
if(gH323ep.listener)
{
ooSocketClose(*(gH323ep.listener));
- gH323ep.listener = NULL;
+ gH323ep.listener = NULL;
}
- ooGkClientDestroy();
+ ooGkClientDestroy();
if(gH323ep.fptraceFile)
{
OO_SETFLAG(gH323ep.flags, OO_M_TUNNELING);
return OO_OK;
}
-
+
int ooH323EpDisableH245Tunneling(void)
{
OO_CLRFLAG(gH323ep.flags, OO_M_TUNNELING);
int ret=OO_OK;
if(number)
{
- strncpy(gH323ep.callingPartyNumber, number,
+ strncpy(gH323ep.callingPartyNumber, number,
sizeof(gH323ep.callingPartyNumber)-1);
ret = ooH323EpAddAliasDialedDigits((char*)number);
return ret;
void ooH323EpPrintConfig(void)
{
OOTRACEINFO1("H.323 Endpoint Configuration is as follows:\n");
-
+
OOTRACEINFO2("\tTrace File: %s\n", gH323ep.traceFile);
if(!OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART))
OOTRACEINFO1("\tAutoAnswer - enabled\n");
else
OOTRACEINFO1("\tAutoAnswer - disabled\n");
-
+
OOTRACEINFO2("\tTerminal Type - %d\n", gH323ep.termType);
OOTRACEINFO2("\tT35 CountryCode - %d\n", gH323ep.t35CountryCode);
OOTRACEINFO2("\tManufacturer Code - %d\n", gH323ep.manufacturerCode);
OOTRACEINFO2("\tProductID - %s\n", gH323ep.productID);
-
+
OOTRACEINFO2("\tVersionID - %s\n", gH323ep.versionID);
OOTRACEINFO2("\tLocal signalling IP address - %s\n", gH323ep.signallingIP);
OOTRACEINFO2("\tCallerID - %s\n", gH323ep.callerid);
- OOTRACEINFO2("\tCall Establishment Timeout - %d seconds\n",
- gH323ep.callEstablishmentTimeout);
+ OOTRACEINFO2("\tCall Establishment Timeout - %d seconds\n",
+ gH323ep.callEstablishmentTimeout);
OOTRACEINFO2("\tMasterSlaveDetermination Timeout - %d seconds\n",
gH323ep.msdTimeout);
OOTRACEINFO2("\tSession Timeout - %d seconds\n", gH323ep.sessionTimeout);
- return;
+ return;
}
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
cb_StopTransmitChannel stopTransmitChannel)
{
return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes, FALSE,
- dir, startReceiveChannel, startTransmitChannel,
+ dir, startReceiveChannel, startTransmitChannel,
stopReceiveChannel, stopTransmitChannel, FALSE);
}
-int ooH323EpAddG7231Capability(int cap, int txframes, int rxframes,
+int ooH323EpAddG7231Capability(int cap, int txframes, int rxframes,
OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooH323EpAddG726Capability(int cap, int txframes, int rxframes,
+int ooH323EpAddG726Capability(int cap, int txframes, int rxframes,
OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooH323EpAddAMRNBCapability(int cap, int txframes, int rxframes,
+int ooH323EpAddAMRNBCapability(int cap, int txframes, int rxframes,
OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooH323EpAddSpeexCapability(int cap, int txframes, int rxframes,
+int ooH323EpAddSpeexCapability(int cap, int txframes, int rxframes,
OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
- silenceSuppression, dir, startReceiveChannel,
- startTransmitChannel, stopReceiveChannel,
+ return ooCapabilityAddSimpleCapability(NULL, cap, txframes, rxframes,
+ silenceSuppression, dir, startReceiveChannel,
+ startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooH323EpAddGSMCapability(int cap, ASN1USINT framesPerPkt,
+int ooH323EpAddGSMCapability(int cap, ASN1USINT framesPerPkt,
OOBOOL comfortNoise, OOBOOL scrambled, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddGSMCapability(NULL, cap, framesPerPkt, comfortNoise,
- scrambled, dir, startReceiveChannel,
+ return ooCapabilityAddGSMCapability(NULL, cap, framesPerPkt, comfortNoise,
+ scrambled, dir, startReceiveChannel,
startTransmitChannel, stopReceiveChannel,
stopTransmitChannel, FALSE);
}
-int ooH323EpAddH263VideoCapability(int cap, unsigned sqcifMPI,
- unsigned qcifMPI, unsigned cifMPI,
- unsigned cif4MPI, unsigned cif16MPI,
- unsigned maxBitRate, int dir,
+int ooH323EpAddH263VideoCapability(int cap, unsigned sqcifMPI,
+ unsigned qcifMPI, unsigned cifMPI,
+ unsigned cif4MPI, unsigned cif16MPI,
+ unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
cb_StopTransmitChannel stopTransmitChannel)
{
- return ooCapabilityAddH263VideoCapability(NULL, sqcifMPI, qcifMPI, cifMPI,
+ return ooCapabilityAddH263VideoCapability(NULL, sqcifMPI, qcifMPI, cifMPI,
cif4MPI, cif16MPI, maxBitRate,dir,
startReceiveChannel, startTransmitChannel,
- stopReceiveChannel, stopTransmitChannel,
+ stopReceiveChannel, stopTransmitChannel,
FALSE);
}
gH323ep.tcpPorts.start = base;
if(max > 65500)
gH323ep.tcpPorts.max = 65500;
- else
+ else
gH323ep.tcpPorts.max = max;
if(gH323ep.tcpPorts.max<gH323ep.tcpPorts.start)
return OO_FAILED;
}
gH323ep.tcpPorts.current = gH323ep.tcpPorts.start;
-
+
OOTRACEINFO1("TCP port range initialize - successful\n");
return OO_OK;
}
gH323ep.udpPorts.start = base;
if(max > 65500)
gH323ep.udpPorts.max = 65500;
- else
+ else
gH323ep.udpPorts.max = max;
-
+
if(gH323ep.udpPorts.max<gH323ep.udpPorts.start)
{
OOTRACEERR1("Error: Failed to set udp ports- Max port number"
" less than Start port number\n");
return OO_FAILED;
}
-
+
gH323ep.udpPorts.current = gH323ep.udpPorts.start;
-
+
OOTRACEINFO1("UDP port range initialize - successful\n");
return OO_OK;
gH323ep.rtpPorts.start = base;
if(max > 65500)
gH323ep.rtpPorts.max = 65500;
- else
+ else
gH323ep.rtpPorts.max = max;
-
+
if(gH323ep.rtpPorts.max<gH323ep.rtpPorts.start)
{
OOTRACEERR1("Error: Failed to set rtp ports- Max port number"
" less than Start port number\n");
return OO_FAILED;
}
-
+
gH323ep.rtpPorts.current = gH323ep.rtpPorts.start;
OOTRACEINFO1("RTP port range initialize - successful\n");
return OO_OK;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooh323ep.h
- * This file contains H323 endpoint related functions.
+ * @file ooh323ep.h
+ * This file contains H323 endpoint related functions.
*/
#ifndef OO_H323EP_H_
#define OO_H323EP_H_
#endif /* EXTERN */
struct OOCapPrefs;
-/**
+/**
* @defgroup h323ep H323 Endpoint management functions
* @{
*/
-
+
/**
* This structure is used to define the port ranges to be used
* by the application.
int current; /*!< Current port number. */
} OOH323Ports;
-/**
+/**
* Structure to store all configuration information related to the
- * endpoint created by an application
+ * endpoint created by an application
*/
typedef struct OOH323EndPoint {
-
- /**
+
+ /**
* This context should be used for allocation of memory for
* items within the endpoint structure.
*/
OOCTXT ctxt;
- /**
+ /**
* This context should be used for allocation of memory for
* message structures.
*/
/** Range of port numbers to be used for RTP connections */
OOH323Ports rtpPorts;
-
+
ASN1UINT flags;
- int termType; /* 50 - Terminal entity with No MC,
- 60 - Gateway entity with no MC,
+ int termType; /* 50 - Terminal entity with No MC,
+ 60 - Gateway entity with no MC,
70 - Terminal Entity with MC, but no MP etc.*/
int t35CountryCode;
int t35Extension;
(enum OOCallMode callMode, const char* tracefile);
/**
- * This function is used to represent the H.323 application endpoint as
+ * This function is used to represent the H.323 application endpoint as
* gateway, instead of an H.323 phone endpoint.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpSetAsGateway(void);
-EXTERN void ooH323EpSetVersionInfo(int t35countrycode, int t35extensions, int manufacturer,
+EXTERN void ooH323EpSetVersionInfo(int t35countrycode, int t35extensions, int manufacturer,
char* vendor, char* version);
/**
* @param listenport Port to be used for listening for incoming calls.
*
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooH323EpSetLocalAddress(const char* localip, int listenport);
/**
* @param base Starting port number for the range
* @param max Ending port number for the range.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpSetTCPPortRange(int base, int max);
* @param base Starting port number for the range
* @param max Ending port number for the range.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpSetUDPPortRange(int base, int max);
* @param base Starting port number for the range
* @param max Ending port number for the range.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpSetRTPPortRange(int base, int max);
/**
* This function is used to add an email id as an alias for the endpoint.
* @param email Email id to be set as an alias.
- *
+ *
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpAddAliasEmailID(const char* email);
EXTERN int ooH323EpAddAliasTransportID(const char* ipaddress);
/**
- * This function is used to clear all the aliases used by the
+ * This function is used to clear all the aliases used by the
* H323 endpoint.
*
* @return OO_OK, on success. OO_FAILED, on failure.
/**
* This function is used to set high level H.323 callbacks for the endpoint.
- * Make sure all unused callbacks in the structure are set to NULL before
+ * Make sure all unused callbacks in the structure are set to NULL before
* calling this function.
- * @param h323Callbacks Callback structure containing various high level
+ * @param h323Callbacks Callback structure containing various high level
* callbacks.
* @return OO_OK, on success. OO_FAILED, on failure
*/
/**
- * This function is the last function to be invoked after done using the
- * stack. It closes the H323 Endpoint for an application, releasing all
+ * This function is the last function to be invoked after done using the
+ * stack. It closes the H323 Endpoint for an application, releasing all
* the associated memory.
*
* @return OO_OK on success
EXTERN int ooH323EpDisableAutoAnswer(void);
/**
- * This function is used to enable manual ringback. By default the stack sends
- * alerting message automatically on behalf of the endpoint application.
+ * This function is used to enable manual ringback. By default the stack sends
+ * alerting message automatically on behalf of the endpoint application.
* However, if endpoint application wants to do alerting user part first before
* sending out alerting message, it can enable this feature.
*
EXTERN int ooH323EpEnableManualRingback(void);
/**
- * This function is used to disable manual ringback. By default the
+ * This function is used to disable manual ringback. By default the
* manual ringback feature is disabled, i.e, the stack sends alerting on behalf
* of the application automatically.
*
* @param productID New value for the product id.
*
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooH323EpSetProductID (const char * productID);
/**
/**
* This function is used to set calling party number to be used for outbound
- * calls.Note, you can override it for a specific call by using
+ * calls.Note, you can override it for a specific call by using
* ooCallSetCallingPartyNumber function.
* @param number e164 number to be used as calling party number.
*
EXTERN int ooH323EpSetCallingPartyNumber(const char * number);
/**
- * This function is used to print the current configuration information of
+ * This function is used to print the current configuration information of
* the H323 endpoint to log file.
*/
void ooH323EpPrintConfig(void);
/**
* This function is used to add G728 capability to the H323 endpoint.
* @param cap Type of G728 capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpAddG728Capability
- (int cap, int txframes, int rxframes, int dir,
+ (int cap, int txframes, int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/**
* This function is used to add G729 capability to the H323 endpoint.
* @param cap Type of G729 capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpAddG729Capability
- (int cap, int txframes, int rxframes, int dir,
+ (int cap, int txframes, int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/**
* This function is used to add G7231 capability to the H323 endpoint.
* @param cap Type of G7231 capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param silenceSuppression Silence Suppression support
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooH323EpAddG7231Capability(int cap, int txframes, int rxframes,
+EXTERN int ooH323EpAddG7231Capability(int cap, int txframes, int rxframes,
OOBOOL silenceSuppression, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
/**
* This function is used to add G711 capability to the H323 endpoint.
* @param cap Type of G711 capability to be added.
- * @param txframes Number of frames per packet for transmission.
+ * @param txframes Number of frames per packet for transmission.
* @param rxframes Number of frames per packet for reception.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooH323EpAddG711Capability
- (int cap, int txframes, int rxframes, int dir,
+ (int cap, int txframes, int rxframes, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/**
* This function is used to add a new GSM capability to the endpoint.
* @param cap Type of GSM capability to be added.
- * @param framesPerPkt Number of GSM frames pre packet.
- * @param comfortNoise Comfort noise spec for the capability.
+ * @param framesPerPkt Number of GSM frames pre packet.
+ * @param comfortNoise Comfort noise spec for the capability.
* @param scrambled Scrambled enabled/disabled for the capability.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooH323EpAddGSMCapability(int cap, ASN1USINT framesPerPkt,
- OOBOOL comfortNoise,OOBOOL scrambled,int dir,
+EXTERN int ooH323EpAddGSMCapability(int cap, ASN1USINT framesPerPkt,
+ OOBOOL comfortNoise,OOBOOL scrambled,int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/**
* This function is used to add H263 video capability to the H323 endpoint.
* @param cap Capability type - OO_H263VIDEO
- * @param sqcifMPI Minimum picture interval for encoding/decoding
+ * @param sqcifMPI Minimum picture interval for encoding/decoding
* of SQCIF pictures.
- * @param qcifMPI Minimum picture interval for encoding/decoding
+ * @param qcifMPI Minimum picture interval for encoding/decoding
* of QCIF pictures.
- * @param cifMPI Minimum picture interval for encoding/decoding
+ * @param cifMPI Minimum picture interval for encoding/decoding
* of CIF pictures.
- * @param cif4MPI Minimum picture interval for encoding/decoding
+ * @param cif4MPI Minimum picture interval for encoding/decoding
* of CIF4 pictures.
- * @param cif16MPI Minimum picture interval for encoding/decoding
+ * @param cif16MPI Minimum picture interval for encoding/decoding
* of CIF16 pictures.
* @param maxBitRate Maximum bit rate in units of 100 bits/s at
- * which a transmitter can transmit video or a
+ * which a transmitter can transmit video or a
* receiver can receive video.
* @param dir Direction of capability.OORX, OOTX, OORXANDTX
* @param startReceiveChannel Callback function to start receive channel.
* @param stopReceiveChannel Callback function to stop receive channel.
* @param stopTransmitChannel Callback function to stop transmit channel.
*
- * @return OO_OK, on success. OO_FAILED, on failure.
+ * @return OO_OK, on success. OO_FAILED, on failure.
*/
-EXTERN int ooH323EpAddH263VideoCapability(int cap, unsigned sqcifMPI,
- unsigned qcifMPI, unsigned cifMPI,
- unsigned cif4MPI, unsigned cif16MPI,
- unsigned maxBitRate, int dir,
+EXTERN int ooH323EpAddH263VideoCapability(int cap, unsigned sqcifMPI,
+ unsigned qcifMPI, unsigned cifMPI,
+ unsigned cif4MPI, unsigned cif16MPI,
+ unsigned maxBitRate, int dir,
cb_StartReceiveChannel startReceiveChannel,
cb_StartTransmitChannel startTransmitChannel,
cb_StopReceiveChannel stopReceiveChannel,
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
#endif
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
}
}
-#ifdef _WIN32
+#ifdef _WIN32
int ooBindOSAllocatedPort(OOSOCKET socket, char *ip)
{
OOIPADDR ipAddrs;
struct sockaddr_in name;
size = sizeof(struct sockaddr_in);
ret= ooSocketStrToAddr (ip, &ipAddrs);
- if((ret=ooSocketBind(socket, ipAddrs,
+ if((ret=ooSocketBind(socket, ipAddrs,
0))==ASN_OK)
{
ret = ooSocketGetSockName(socket, &name, &size);
if(ret == ASN_OK)
{
return name.sin_port;
-
+
}
}
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooports.h
- * This file contains functions to manage ports used by the stack.
+ * @file ooports.h
+ * This file contains functions to manage ports used by the stack.
*/
#ifndef _OOPORTS_H_
/**
* Get the next port of type TCP/UDP/RTP from the corresponding range.
- * When max value for the range is reached, it starts again from the
+ * When max value for the range is reached, it starts again from the
* first port number of the range.
*
* @param ep Reference to the H323 Endpoint structure.
EXTERN int ooBindPort (OOH323PortType type, OOSOCKET socket, char *ip);
/**
- * This function is supported for windows version only.
+ * This function is supported for windows version only.
* Windows sockets have problem in reusing the addresses even after
* setting SO_REUSEADDR, hence in windows we just allow os to bind
* to any random port.
* socket is bound and in case of failure just returns
* a negative value.
*/
-#ifdef _WIN32
+#ifdef _WIN32
EXTERN int ooBindOSAllocatedPort(OOSOCKET socket, char *ip);
#endif
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
6, { 0, 0, 8, 2250, 0, 4 }
};
-EXTERN int ooQ931Decode
+EXTERN int ooQ931Decode
(OOH323CallData *call, Q931Message* msg, int length, ASN1OCTET *data, int docallbacks)
{
int offset, x;
if(msg->fromDestination)
OOTRACEDBGB1(" from = destination\n");
else
- OOTRACEDBGB1(" from = originator\n");
+ OOTRACEDBGB1(" from = originator\n");
msg->messageType = data[4];
OOTRACEDBGB2(" messageType = %x\n", msg->messageType);
-
+
/* Have preamble, start getting the informationElements into buffers */
offset = 5;
while (offset < length) {
the Q931 documentation claims the length is a single byte,
unfortunately all H.323 based apps have a 16 bit length here, so
we allow for said longer length. There is presumably an addendum
- to Q931 which describes this, and provides a means to
- discriminate between the old 1 byte and the new 2 byte systems.
+ to Q931 which describes this, and provides a means to
+ discriminate between the old 1 byte and the new 2 byte systems.
However, at present we assume it is always 2 bytes until we find
- something that breaks it.
+ something that breaks it.
*/
len <<= 8;
len |= data[offset++];
}
else alen = len;
- ie = (Q931InformationElement*)
+ ie = (Q931InformationElement*)
memAlloc (pctxt, sizeof(*ie) - sizeof(ie->data) + alen);
if(!ie)
{
- OOTRACEERR3("Error:Memory - ooQ931Decode - ie(%s, %s)\n",
+ OOTRACEERR3("Error:Memory - ooQ931Decode - ie(%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
ie->discriminator = discriminator;
ie->offset = ieOff;
ie->length = len;
- if (alen != 0)
+ if (alen != 0)
memcpy(ie->data, data + offset, alen);
offset += len;
}
else {
- ie = (Q931InformationElement*) memAlloc (pctxt,
+ ie = (Q931InformationElement*) memAlloc (pctxt,
sizeof(*ie));
if(!ie)
{
- OOTRACEERR3("Error:Memory - ooQ931Decode - ie(%s, %s)\n",
+ OOTRACEERR3("Error:Memory - ooQ931Decode - ie(%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
gH323ep.h323Callbacks.onReceivedDTMF(call, (char *)ie->data);
}
}
- /* Extract calling party number TODO:Give respect to presentation and
+ /* Extract calling party number TODO:Give respect to presentation and
screening indicators ;-) */
if(ie->discriminator == Q931CallingPartyNumberIE)
{
OOTRACEDBGB1(" CallingPartyNumber IE = {\n");
if(ie->length < OO_MAX_NUMBER_LENGTH)
{
- int numoffset=1;
+ int numoffset=1;
if(!(0x80 & ie->data[0])) numoffset = 2;
memcpy(number, ie->data+numoffset,ie->length-numoffset);
number[ie->length-numoffset]='\0';
ooCallSetCallingPartyNumber(call, number);
}
else{
- OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
+ OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
call->callType, call->callToken);
}
OOTRACEDBGB1(" }\n");
ooCallSetCalledPartyNumber(call, number);
}
else{
- OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
+ OOTRACEERR3("Error:Calling party number too long. (%s, %s)\n",
call->callType, call->callToken);
}
OOTRACEDBGB1(" }\n");
if (rv != ASN_OK)
return rv;
}
-
- /*cisco router sends Q931Notify without UU ie,
+
+ /*cisco router sends Q931Notify without UU ie,
we just ignore notify message as of now as handling is optional for
end point*/
if(msg->messageType != Q931NotifyMsg && msg->messageType != Q931StatusMsg)
return rv;
}
-EXTERN Q931InformationElement* ooQ931GetIE (const Q931Message* q931msg,
+EXTERN Q931InformationElement* ooQ931GetIE (const Q931Message* q931msg,
int ieCode)
{
DListNode* curNode;
printf("Q.931 Message:\n");
printf(" protocolDiscriminator: %u\n", q931msg->protocolDiscriminator);
printf(" callReference: %u\n", q931msg->callReference);
- printf(" from: %s\n", (q931msg->fromDestination ?
+ printf(" from: %s\n", (q931msg->fromDestination ?
"destination" : "originator"));
- printf(" messageType: %s (0x%X)\n\n",
- ooQ931GetMessageTypeName(q931msg->messageType, buf),
+ printf(" messageType: %s (0x%X)\n\n",
+ ooQ931GetMessageTypeName(q931msg->messageType, buf),
q931msg->messageType);
for(i = 0, curNode = q931msg->ies.head; i < q931msg->ies.count; i++) {
Q931InformationElement *ie = (Q931InformationElement*) curNode->data;
int length = (ie->length >= 0) ? ie->length : -ie->length;
printf(" IE[%u] (offset 0x%X):\n", i, (unsigned)ie->offset);
- printf(" discriminator: %s (0x%X)\n",
+ printf(" discriminator: %s (0x%X)\n",
ooQ931GetIEName(ie->discriminator, buf), (unsigned)ie->discriminator);
printf(" data length: %i\n", length);
-
+
curNode = curNode->next;
printf("\n");
}
int ooCreateQ931Message(OOCTXT* pctxt, Q931Message **q931msg, int msgType)
{
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
-
+
*q931msg = (Q931Message*)memAllocZ(pctxt, sizeof(Q931Message));
-
+
if(!*q931msg)
{
OOTRACEERR1("Error:Memory - ooCreateQ931Message - q931msg\n");
ASN1INT64 timestamp;
int i=0;
#ifdef _WIN32
-
+
SYSTEMTIME systemTime;
GetLocalTime(&systemTime);
SystemTimeToFileTime(&systemTime, (LPFILETIME)×tamp);
OOTRACEERR1("ERROR: Invalid Q931 message in add user-user IE\n");
return OO_FAILED;
}
-
+
if(!q931msg->userInfo)
{
OOTRACEERR1("ERROR: No User-User IE to encode\n");
}
setPERBuffer(pctxt, msgbuf, sizeof(msgbuf), aligned);
-
- if(asn1PE_H225H323_UserInformation (pctxt,
+
+ if(asn1PE_H225H323_UserInformation (pctxt,
q931msg->userInfo)==ASN_OK)
{
OOTRACEDBGC1("UserInfo encoding - successful\n");
ie->discriminator = Q931UserUserIE;
ie->length = len;
memcpy(ie->data, msgptr, len);
- /* Add the user to user IE NOTE: ALL IEs SHOULD BE IN ASCENDING ORDER OF
- THEIR DISCRIMINATOR AS PER SPEC.
+ /* Add the user to user IE NOTE: ALL IEs SHOULD BE IN ASCENDING ORDER OF
+ THEIR DISCRIMINATOR AS PER SPEC.
*/
dListInit (&(q931msg->ies));
- if((dListAppend (pctxt,
+ if((dListAppend (pctxt,
&(q931msg->ies), ie)) == NULL)
{
OOTRACEERR1("Error: Failed to add UUIE in outgoing message\n");
OOTRACEERR1("Error: ooDecodeUUIE failed - NULL q931 message\n");
return OO_FAILED;
}
-
+
/* Search for UserUser IE */
- for(i = 0, curNode = q931Msg->ies.head; i < q931Msg->ies.count;
- i++, curNode = curNode->next)
+ for(i = 0, curNode = q931Msg->ies.head; i < q931Msg->ies.count;
+ i++, curNode = curNode->next)
{
ie = (Q931InformationElement*) curNode->data;
if(ie && ie->discriminator == Q931UserUserIE)
OOTRACEERR1("No UserUser IE found in ooDecodeUUIE\n");
return OO_FAILED;
}
-
+
/* Decode user-user ie */
q931Msg->userInfo = (H225H323_UserInformation *) memAlloc(pctxt,
sizeof(H225H323_UserInformation));
}
#ifndef _COMPACT
-static void ooQ931PrintMessage
+static void ooQ931PrintMessage
(OOH323CallData* call, ASN1OCTET *msgbuf, ASN1UINT msglen)
{
ret = ooQ931Decode (call, &q931Msg, msglen, msgbuf, 0);
if(ret != OO_OK)
{
- OOTRACEERR3("Error:Failed decoding Q931 message. (%s, %s)\n",
+ OOTRACEERR3("Error:Failed decoding Q931 message. (%s, %s)\n",
call->callType, call->callToken);
}
finishPrint();
-int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg,
+int ooEncodeH225Message(OOH323CallData *call, Q931Message *pq931Msg,
char *msgbuf, int size)
{
int len=0, i=0, j=0, ieLen=0;
else if(pq931Msg->messageType == Q931CallProceedingMsg){
msgbuf[i++] = OOCallProceeding;
}
- else if(pq931Msg->messageType == Q931AlertingMsg ||
+ else if(pq931Msg->messageType == Q931AlertingMsg ||
pq931Msg->messageType == Q931ProgressMsg){
msgbuf[i++] = OOAlert;
}
stat = ooEncodeUUIE(call->msgctxt, pq931Msg);
if(stat != OO_OK)
{
- OOTRACEERR3("Error:Failed to encode uuie. (%s, %s)\n", call->callType,
+ OOTRACEERR3("Error:Failed to encode uuie. (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
-
+
msgbuf[i++] = 3; /* TPKT version */
msgbuf[i++] = 0; /* TPKT resevred */
/* 1st octet of length, will be populated once len is determined */
- msgbuf[i++] = 0;
+ msgbuf[i++] = 0;
/* 2nd octet of length, will be populated once len is determined */
- msgbuf[i++] = 0;
+ msgbuf[i++] = 0;
/* Q931 protocol discriminator */
msgbuf[i++] = pq931Msg->protocolDiscriminator;
msgbuf[i++] = 2; /* length of call ref is two octets */
else
i++; /* fromOriginator*/
-
+
msgbuf[i++] = pq931Msg->callReference; /* populate 2nd octet */
msgbuf[i++] = pq931Msg->messageType; /* type of q931 message */
/* Note: the order in which ies are added is important. It is in the
- ascending order of ie codes.
+ ascending order of ie codes.
*/
/* Add bearer IE */
if(pq931Msg->bearerCapabilityIE)
- {
+ {
msgbuf[i++] = Q931BearerCapabilityIE; /* ie discriminator */
msgbuf[i++] = pq931Msg->bearerCapabilityIE->length;
- memcpy(msgbuf+i, pq931Msg->bearerCapabilityIE->data,
+ memcpy(msgbuf+i, pq931Msg->bearerCapabilityIE->data,
pq931Msg->bearerCapabilityIE->length);
i += pq931Msg->bearerCapabilityIE->length;
- }
+ }
/* Add cause IE */
if(pq931Msg->causeIE)
msgbuf[i++] = pq931Msg->causeIE->length;
memcpy(msgbuf+i, pq931Msg->causeIE->data, pq931Msg->causeIE->length);
i += pq931Msg->causeIE->length;
- }
-
+ }
+
/* Add progress indicator IE */
if(pq931Msg->messageType == Q931AlertingMsg || pq931Msg->messageType == Q931ProgressMsg)
{
pq931Msg->calledPartyNumberIE->length);
i += pq931Msg->calledPartyNumberIE->length;
}
-
+
/* Add keypad ie */
if(pq931Msg->keypadIE)
{
i += pq931Msg->callstateIE->length;
}
- /* Note: Have to fix this, though it works. Need to get rid of ie list.
+ /* Note: Have to fix this, though it works. Need to get rid of ie list.
Right now we only put UUIE in ie list. Can be easily removed.
*/
- for(j = 0, curNode = pq931Msg->ies.head; j < (int)pq931Msg->ies.count; j++)
+ for(j = 0, curNode = pq931Msg->ies.head; j < (int)pq931Msg->ies.count; j++)
{
Q931InformationElement *ie = (Q931InformationElement*) curNode->data;
-
+
ieLen = ie->length;
/* Add the ie discriminator in message buffer */
- msgbuf[i++] = ie->discriminator;
-
+ msgbuf[i++] = ie->discriminator;
+
/* For user-user IE, we have to add protocol discriminator */
if (ie->discriminator == Q931UserUserIE)
{
memcpy((msgbuf + i), ie->data, ieLen);
i += ieLen;
-
+
}
else
{
}
}
// len = i+1-4; /* complete message length */
-
+
/* Tpkt length octets populated with total length of the message */
if(msgbuf[0] != OOFacility)
{
len = i-1;
- msgbuf[3] = (len >> 8);
+ msgbuf[3] = (len >> 8);
msgbuf[4] = len; /* including tpkt header */
}
else{
msgbuf[6] = (len >> 8);
msgbuf[7] = len;
}
-
+
#ifndef _COMPACT
if(msgbuf[0] != OOFacility)
ooQ931PrintMessage (call, (unsigned char *)msgbuf+5, len-4);
}
-int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg,
+int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg,
ASN1UINT *fsCount, ASN1DynOctStr **fsElem)
{
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
- OOCTXT *pctxt = pCall->msgctxt;
+ OOCTXT *pctxt = pCall->msgctxt;
int ret = 0, i=0, j=0, remoteMediaPort=0, remoteMediaControlPort = 0, dir=0;
char remoteMediaIP[2+8*4+7], remoteMediaControlIP[2+8*4+7];
DListNode *pNode = NULL;
H245OpenLogicalChannel *olc = NULL, printOlc;
ooH323EpCapability *epCap = NULL;
ASN1DynOctStr *pFS=NULL;
- H245H2250LogicalChannelParameters *h2250lcp = NULL;
+ H245H2250LogicalChannelParameters *h2250lcp = NULL;
ooLogicalChannel* pChannel;
(*fsElem)[k].numocts = pCall->pFastStartRes->elem[k].numocts;
pData = (ASN1OCTET*) memAlloc(
pctxt, (*fsElem)[k].numocts * sizeof(ASN1OCTET));
- memcpy(pData,
- pCall->pFastStartRes->elem[k].data,
+ memcpy(pData,
+ pCall->pFastStartRes->elem[k].data,
pCall->pFastStartRes->elem[k].numocts);
(*fsElem)[k].data = pData;
}
return ASN_OK;
}
-
-
+
+
/* If fast start supported and remote endpoint has sent faststart element */
- if(OO_TESTFLAG(pCall->flags, OO_M_FASTSTART) &&
+ if(OO_TESTFLAG(pCall->flags, OO_M_FASTSTART) &&
pCall->remoteFastStartOLCs.count>0)
{
- pFS = (ASN1DynOctStr*)memAlloc(pctxt,
+ pFS = (ASN1DynOctStr*)memAlloc(pctxt,
pCall->remoteFastStartOLCs.count*sizeof(ASN1DynOctStr));
if(!pFS)
{
- OOTRACEERR3("Error:Memory - ooSetFastStartResponse - pFS (%s, %s)\n",
- pCall->callType, pCall->callToken);
+ OOTRACEERR3("Error:Memory - ooSetFastStartResponse - pFS (%s, %s)\n",
+ pCall->callType, pCall->callToken);
return OO_FAILED;
}
memset(pFS, 0, pCall->remoteFastStartOLCs.count*sizeof(ASN1DynOctStr));
olc = (H245OpenLogicalChannel*)pNode->data;
/* Don't support both direction channel */
- if(olc->forwardLogicalChannelParameters.dataType.t !=
+ if(olc->forwardLogicalChannelParameters.dataType.t !=
T_H245DataType_nullData &&
olc->m.reverseLogicalChannelParametersPresent)
{
}
/* Check forward logic channel */
- if(olc->forwardLogicalChannelParameters.dataType.t !=
+ if(olc->forwardLogicalChannelParameters.dataType.t !=
T_H245DataType_nullData)
{
/* Forward Channel - remote transmits - local receives */
- OOTRACEDBGC4("Processing received forward olc %d (%s, %s)\n",
- olc->forwardLogicalChannelNumber, pCall->callType,
+ OOTRACEDBGC4("Processing received forward olc %d (%s, %s)\n",
+ olc->forwardLogicalChannelNumber, pCall->callType,
pCall->callToken);
dir = OORX;
- epCap = ooIsDataTypeSupported(pCall,
+ epCap = ooIsDataTypeSupported(pCall,
&olc->forwardLogicalChannelParameters.dataType,
OORX);
-
+
if(!epCap) { continue; } /* Not Supported Channel */
OOTRACEINFO1("Receive Channel data type supported\n");
T_H245OpenLogicalChannel_forwardLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
- olc->forwardLogicalChannelNumber,
+ "channel %d (%s, %s)\n",
+ olc->forwardLogicalChannelNumber,
pCall->callType, pCall->callToken);
memFreePtr(pCall->pctxt, epCap);
epCap = NULL;
{
OOTRACEINFO4("Receive channel with sessionID %d already "
- "established.(%s, %s)\n", olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID,
+ "established.(%s, %s)\n", olc->forwardLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters->sessionID,
pCall->callType, pCall->callToken);
memFreePtr(pCall->pctxt, epCap);
epCap = NULL;
/* Extract mediaControlChannel info, if supplied */
if(h2250lcp->m.mediaControlChannelPresent)
{
- if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
- &h2250lcp->mediaControlChannel,
+ if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
+ &h2250lcp->mediaControlChannel,
remoteMediaControlIP, &remoteMediaControlPort))
{
OOTRACEERR3("Error: Invalid media control channel address "
else if(olc->m.reverseLogicalChannelParametersPresent)
{
/* Reverse channel - remote receives - local transmits */
- OOTRACEDBGC4("Processing received reverse olc %d (%s, %s)\n",
- olc->forwardLogicalChannelNumber, pCall->callType,
+ OOTRACEDBGC4("Processing received reverse olc %d (%s, %s)\n",
+ olc->forwardLogicalChannelNumber, pCall->callType,
pCall->callToken);
dir = OOTX;
- epCap = ooIsDataTypeSupported(pCall,
+ epCap = ooIsDataTypeSupported(pCall,
&olc->reverseLogicalChannelParameters.dataType,
OOTX);
OOTRACEINFO1("Transmit Channel data type supported\n");
- if(olc->reverseLogicalChannelParameters.multiplexParameters.t !=
+ if(olc->reverseLogicalChannelParameters.multiplexParameters.t !=
T_H245OpenLogicalChannel_reverseLogicalChannelParameters_multiplexParameters_h2250LogicalChannelParameters)
{
OOTRACEERR4("ERROR:Unknown multiplex parameter type for "
- "channel %d (%s, %s)\n",
- olc->forwardLogicalChannelNumber,
+ "channel %d (%s, %s)\n",
+ olc->forwardLogicalChannelNumber,
pCall->callType, pCall->callToken);
memFreePtr(pCall->pctxt, epCap);
epCap = NULL;
epCap = NULL;
continue;
}
-
+
/* Extract the remote media endpoint address */
h2250lcp = olc->reverseLogicalChannelParameters.multiplexParameters.u.h2250LogicalChannelParameters;
if(!h2250lcp)
epCap = NULL;
return OO_FAILED;
}
-
+
/* Reverse Channel info will be always present, crash proof */
if(!h2250lcp->m.mediaChannelPresent)
{
}
/* Get IP, PORT of reverse channel */
- if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
- &h2250lcp->mediaChannel,
+ if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
+ &h2250lcp->mediaChannel,
remoteMediaIP, &remoteMediaPort))
{
OOTRACEERR3("Error: Invalid media channel address "
/* Extract mediaControlChannel info, if supplied */
if(h2250lcp->m.mediaControlChannelPresent)
{
- if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
- &h2250lcp->mediaControlChannel,
+ if(OO_OK != ooGetIpPortFromH245TransportAddress(pCall,
+ &h2250lcp->mediaControlChannel,
remoteMediaControlIP, &remoteMediaControlPort))
{
OOTRACEERR3("Error: Invalid media control channel address "
}
if(dir & OOTX)
- {
+ {
/* According to the spec if we are accepting olc for transmission
from called endpoint to calling endpoint, called endpoint should
insert a unqiue forwardLogicalChannelNumber into olc
pCall->logicalChanNoCur = pCall->logicalChanNoBase;
}
-
+
ooBuildFastStartOLC(pCall, olc, epCap, pctxt, dir);
-
+
pChannel = ooFindLogicalChannelByLogicalChannelNo
(pCall, olc->forwardLogicalChannelNumber);
-
+
/* start receive and tramsmit channel listening */
if(dir & OORX)
{
strcpy(pChannel->remoteIP, remoteMediaControlIP);
pChannel->remoteMediaControlPort = remoteMediaControlPort;
if(epCap->startReceiveChannel)
- {
- epCap->startReceiveChannel(pCall, pChannel);
- OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",
+ {
+ epCap->startReceiveChannel(pCall, pChannel);
+ OOTRACEINFO4("Receive channel of type %s started (%s, %s)\n",
(epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
pCall->callType, pCall->callToken);
}
else{
OOTRACEERR4("ERROR:No callback registered to start receive %s"
- " channel (%s, %s)\n",
- (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
+ " channel (%s, %s)\n",
+ (epCap->capType == OO_CAP_TYPE_AUDIO)?"audio":"video",
pCall->callType, pCall->callToken);
return OO_FAILED;
}
pChannel->remoteMediaControlPort = remoteMediaControlPort;
if(epCap->startTransmitChannel)
- {
- epCap->startTransmitChannel(pCall, pChannel);
+ {
+ epCap->startTransmitChannel(pCall, pChannel);
OOTRACEINFO3("Transmit channel of type audio started "
"(%s, %s)\n", pCall->callType, pCall->callToken);
/*OO_SETFLAG (pCall->flags, OO_M_AUDIO);*/
}
else{
OOTRACEERR3("ERROR:No callback registered to start transmit"
- " audio channel (%s, %s)\n", pCall->callType,
+ " audio channel (%s, %s)\n", pCall->callType,
pCall->callToken);
return OO_FAILED;
}
ret = asn1PD_H245OpenLogicalChannel(pctxt, &(printOlc));
if(ret != ASN_OK)
{
- OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n",
+ OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n",
pCall->callType, pCall->callToken);
ooFreeQ931Message(pctxt, pQ931msg);
if(pCall->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
finishPrint();
- removeEventHandler(pctxt);
+ removeEventHandler(pctxt);
/* end print call */
olc = NULL;
ASN1OCTET* pData;
//*fsPresent = TRUE;
*fsCount = j;
- *fsElem = pFS;
+ *fsElem = pFS;
/* save the fast start response for later use in ALERTING, CONNECT */
pCall->pFastStartRes = (FastStartResponse*)
memAlloc(pCall->pctxt, sizeof(FastStartResponse));
pCall->pFastStartRes->n = j;
- pCall->pFastStartRes->elem = (ASN1DynOctStr*) memAlloc(pCall->pctxt,
+ pCall->pFastStartRes->elem = (ASN1DynOctStr*) memAlloc(pCall->pctxt,
pCall->pFastStartRes->n * sizeof(ASN1DynOctStr));
for(k = 0; k < pCall->pFastStartRes->n; k ++) {
pCall->pFastStartRes->elem[k].numocts = (*fsElem)[k].numocts;
- pData = (ASN1OCTET*) memAlloc(pCall->pctxt,
+ pData = (ASN1OCTET*) memAlloc(pCall->pctxt,
pCall->pFastStartRes->elem[k].numocts * sizeof(ASN1OCTET));
memcpy(pData, (*fsElem)[k].data, (*fsElem)[k].numocts);
pCall->pFastStartRes->elem[k].data = pData;
}
else{
OOTRACEINFO3("None of the faststart elements received in setup can be"
- " supported, rejecting faststart.(%s, %s)\n",
+ " supported, rejecting faststart.(%s, %s)\n",
pCall->callType, pCall->callToken);
//*fsPresent = FALSE;
OO_CLRFLAG(pCall->flags, OO_M_FASTSTART);
int ooSendCallProceeding(OOH323CallData *call)
{
- int ret;
+ int ret;
H225VendorIdentifier *vendor;
H225CallProceeding_UUIE *callProceeding;
Q931Message *q931msg=NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
OOCTXT *pctxt = call->msgctxt;
- OOTRACEDBGC3("Building CallProceeding (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building CallProceeding (%s, %s)\n", call->callType,
call->callToken);
ret = ooCreateQ931Message(pctxt, &q931msg, Q931CallProceedingMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 Call "
"Proceeding message\n");
return OO_FAILED;
}
-
+
q931msg->callReference = call->callReference;
q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt,
return OO_FAILED;
}
memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation));
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG(call->flags, OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG(call->flags, OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_callProceeding;
-
+
callProceeding = (H225CallProceeding_UUIE*)memAlloc(pctxt,
sizeof(H225CallProceeding_UUIE));
if(!callProceeding)
callProceeding->maintainConnection = FALSE;
callProceeding->m.callIdentifierPresent = 1;
- callProceeding->callIdentifier.guid.numocts =
+ callProceeding->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(callProceeding->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(callProceeding->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
- callProceeding->protocolIdentifier = gProtocolID;
+ callProceeding->protocolIdentifier = gProtocolID;
/* Pose as Terminal or Gateway */
if(gH323ep.isGateway)
if(gH323ep.productID)
{
vendor->m.productIdPresent = 1;
- vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
+ vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
sizeof(vendor->productId.data));
- strncpy((char *)vendor->productId.data, gH323ep.productID,
+ strncpy((char *)vendor->productId.data, gH323ep.productID,
vendor->productId.numocts);
}
if(gH323ep.versionID)
{
vendor->m.versionIdPresent = 1;
- vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
+ vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
sizeof(vendor->versionId.data));
- strncpy((char *)vendor->versionId.data, gH323ep.versionID,
- vendor->versionId.numocts);
+ strncpy((char *)vendor->versionId.data, gH323ep.versionID,
+ vendor->versionId.numocts);
}
vendor->vendor.t35CountryCode = gH323ep.t35CountryCode;
vendor->vendor.t35Extension = gH323ep.t35Extension;
vendor->vendor.manufacturerCode = gH323ep.manufacturerCode;
-
- OOTRACEDBGA3("Built Call Proceeding(%s, %s)\n", call->callType,
- call->callToken);
+
+ OOTRACEDBGA3("Built Call Proceeding(%s, %s)\n", call->callType,
+ call->callToken);
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
int ooSendAlerting(OOH323CallData *call)
{
- int ret;
+ int ret;
H225Alerting_UUIE *alerting;
H225VendorIdentifier *vendor;
Q931Message *q931msg=NULL;
ret = ooCreateQ931Message(pctxt, &q931msg, Q931AlertingMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 "
"Alerting message\n");
return OO_FAILED;
return OO_FAILED;
}
memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation));
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
- OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
+ OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_alerting;
-
- alerting = (H225Alerting_UUIE*)memAlloc(pctxt,
+
+ alerting = (H225Alerting_UUIE*)memAlloc(pctxt,
sizeof(H225Alerting_UUIE));
if(!alerting)
{
/*Populate aliases */
alerting->m.alertingAddressPresent = TRUE;
if(call->ourAliases)
- ret = ooPopulateAliasList(pctxt, call->ourAliases,
+ ret = ooPopulateAliasList(pctxt, call->ourAliases,
&alerting->alertingAddress, 0);
else
ret = ooPopulateAliasList(pctxt, gH323ep.aliases,
return OO_FAILED;
}
alerting->m.presentationIndicatorPresent = TRUE;
- alerting->presentationIndicator.t =
+ alerting->presentationIndicator.t =
T_H225PresentationIndicator_presentationAllowed;
alerting->m.screeningIndicatorPresent = TRUE;
alerting->screeningIndicator = userProvidedNotScreened;
alerting->m.callIdentifierPresent = 1;
- alerting->callIdentifier.guid.numocts =
+ alerting->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(alerting->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(alerting->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
- alerting->protocolIdentifier = gProtocolID;
+ alerting->protocolIdentifier = gProtocolID;
/* Pose as Terminal or Gateway */
if(gH323ep.isGateway)
if(gH323ep.productID)
{
vendor->m.productIdPresent = 1;
- vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
+ vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
sizeof(vendor->productId.data));
- strncpy((char *)vendor->productId.data, gH323ep.productID,
+ strncpy((char *)vendor->productId.data, gH323ep.productID,
vendor->productId.numocts);
}
if(gH323ep.versionID)
{
vendor->m.versionIdPresent = 1;
- vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
+ vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
sizeof(vendor->versionId.data));
- strncpy((char *)vendor->versionId.data, gH323ep.versionID,
- vendor->versionId.numocts);
+ strncpy((char *)vendor->versionId.data, gH323ep.versionID,
+ vendor->versionId.numocts);
}
-
+
vendor->vendor.t35CountryCode = gH323ep.t35CountryCode;
vendor->vendor.t35Extension = gH323ep.t35Extension;
vendor->vendor.manufacturerCode = gH323ep.manufacturerCode;
-
+
if (!call->fsSent) {
- ret = ooSetFastStartResponse(call, q931msg,
+ ret = ooSetFastStartResponse(call, q931msg,
&alerting->fastStart.n, &alerting->fastStart.elem);
if(ret != ASN_OK) { return ret; }
if(alerting->fastStart.n > 0) {
}
OOTRACEDBGA3("Built Alerting (%s, %s)\n", call->callType, call->callToken);
-
+
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
int ooSendProgress(OOH323CallData *call)
{
- int ret;
+ int ret;
H225Progress_UUIE *progress;
H225VendorIdentifier *vendor;
Q931Message *q931msg=NULL;
ret = ooCreateQ931Message(pctxt, &q931msg, Q931ProgressMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 "
"Alerting message\n");
return OO_FAILED;
return OO_FAILED;
}
memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation));
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
- OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
+ OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_progress;
-
- progress = (H225Progress_UUIE*)memAlloc(pctxt,
+
+ progress = (H225Progress_UUIE*)memAlloc(pctxt,
sizeof(H225Progress_UUIE));
if(!progress)
{
progress->multipleCalls = FALSE;
progress->maintainConnection = FALSE;
- progress->callIdentifier.guid.numocts =
+ progress->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(progress->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(progress->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
- progress->protocolIdentifier = gProtocolID;
+ progress->protocolIdentifier = gProtocolID;
/* Pose as Terminal or Gateway */
if(gH323ep.isGateway)
if(gH323ep.productID)
{
vendor->m.productIdPresent = 1;
- vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
+ vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
sizeof(vendor->productId.data));
- strncpy((char *)vendor->productId.data, gH323ep.productID,
+ strncpy((char *)vendor->productId.data, gH323ep.productID,
vendor->productId.numocts);
}
if(gH323ep.versionID)
{
vendor->m.versionIdPresent = 1;
- vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
+ vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
sizeof(vendor->versionId.data));
- strncpy((char *)vendor->versionId.data, gH323ep.versionID,
- vendor->versionId.numocts);
+ strncpy((char *)vendor->versionId.data, gH323ep.versionID,
+ vendor->versionId.numocts);
}
-
+
vendor->vendor.t35CountryCode = gH323ep.t35CountryCode;
vendor->vendor.t35Extension = gH323ep.t35Extension;
vendor->vendor.manufacturerCode = gH323ep.manufacturerCode;
-
+
if (!call->fsSent) {
- ret = ooSetFastStartResponse(call, q931msg,
+ ret = ooSetFastStartResponse(call, q931msg,
&progress->fastStart.n, &progress->fastStart.elem);
if(ret != ASN_OK) { return ret; }
if(progress->fastStart.n > 0) {
/* Add h245 listener address. Do not add H245 listener address in case
of tunneling. */
- if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) ||
+ if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) ||
call->remoteFastStartOLCs.count == 0) && */
!OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
!call->h245listener && ooCreateH245Listener(call) == OO_OK)
if (call->versionIP == 6) {
progress->m.h245AddressPresent = TRUE;
progress->h245Address.t = T_H225TransportAddress_ip6Address;
-
+
h245Ip6Addr = (H225TransportAddress_ip6Address*)
memAllocZ (pctxt, sizeof(H225TransportAddress_ip6Address));
if(!h245Ip6Addr)
} else {
progress->m.h245AddressPresent = TRUE;
progress->h245Address.t = T_H225TransportAddress_ipAddress;
-
+
h245IpAddr = (H225TransportAddress_ipAddress*)
memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress));
if(!h245IpAddr)
}
OOTRACEDBGA3("Built Progress (%s, %s)\n", call->callType, call->callToken);
-
+
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
sizeof(H225H323_UserInformation));
if(!pQ931Msg->userInfo)
{
- OOTRACEERR3("ERROR:Memory - ooSendFacility - userInfo(%s, %s)\n",
+ OOTRACEERR3("ERROR:Memory - ooSendFacility - userInfo(%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
memset (pQ931Msg->userInfo, 0, sizeof(H225H323_UserInformation));
- pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG (call->flags, OO_M_TUNNELING);
+ pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG (call->flags, OO_M_TUNNELING);
- pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_facility;
-
- facility = (H225Facility_UUIE*)
+
+ facility = (H225Facility_UUIE*)
memAllocZ (pctxt, sizeof(H225Facility_UUIE));
if(!facility)
pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.u.facility = facility;
/* Populate Facility UUIE */
- facility->protocolIdentifier = gProtocolID;
+ facility->protocolIdentifier = gProtocolID;
facility->m.callIdentifierPresent = 1;
- facility->callIdentifier.guid.numocts =
+ facility->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(facility->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(facility->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
facility->reason.t = T_H225FacilityReason_startH245;
int ooSendStatus(OOH323CallData *call)
{
- int ret;
+ int ret;
H225Status_UUIE *status;
Q931Message *q931msg=NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
OOCTXT *pctxt = call->msgctxt;
- OOTRACEDBGC3("Building StatusMsg (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building StatusMsg (%s, %s)\n", call->callType,
call->callToken);
ret = ooCreateQ931Message(pctxt, &q931msg, Q931StatusMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 Status "
"message\n");
return OO_FAILED;
}
-
+
q931msg->callReference = call->callReference;
q931msg->userInfo = (H225H323_UserInformation*)memAllocZ(pctxt,
OOTRACEERR1("ERROR:Memory - ooSendStatus - userInfo\n");
return OO_FAILED;
}
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG(call->flags, OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG(call->flags, OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_status;
-
+
status = (H225Status_UUIE*)memAllocZ(pctxt,
sizeof(H225Status_UUIE));
if(!status)
}
q931msg->userInfo->h323_uu_pdu.h323_message_body.u.status = status;
- status->callIdentifier.guid.numocts =
+ status->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(status->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(status->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
- status->protocolIdentifier = gProtocolID;
+ status->protocolIdentifier = gProtocolID;
ooQ931SetCauseIE(pctxt, q931msg, Q931StatusEnquiryResponse, 0, 0);
ooQ931SetCallStateIE(pctxt, q931msg, 10);
- OOTRACEDBGA3("Built Status (%s, %s)\n", call->callType,
- call->callToken);
+ OOTRACEDBGA3("Built Status (%s, %s)\n", call->callType,
+ call->callToken);
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
int ooSendStatusInquiry(OOH323CallData *call)
{
- int ret;
+ int ret;
H225StatusInquiry_UUIE *statusInq;
Q931Message *q931msg=NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
OOCTXT *pctxt = call->msgctxt;
- OOTRACEDBGC3("Building StatusInquryMsg (%s, %s)\n", call->callType,
+ OOTRACEDBGC3("Building StatusInquryMsg (%s, %s)\n", call->callType,
call->callToken);
ret = ooCreateQ931Message(pctxt, &q931msg, Q931StatusEnquiryMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 Status "
"message\n");
return OO_FAILED;
}
-
+
q931msg->callReference = call->callReference;
q931msg->userInfo = (H225H323_UserInformation*)memAllocZ(pctxt,
OOTRACEERR1("ERROR:Memory - ooSendStatus - userInfo\n");
return OO_FAILED;
}
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG(call->flags, OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG(call->flags, OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_statusInquiry;
-
+
statusInq = (H225StatusInquiry_UUIE*)memAllocZ(pctxt,
sizeof(H225StatusInquiry_UUIE));
if(!statusInq)
}
q931msg->userInfo->h323_uu_pdu.h323_message_body.u.statusInquiry = statusInq;
- statusInq->callIdentifier.guid.numocts =
+ statusInq->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(statusInq->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(statusInq->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
- statusInq->protocolIdentifier = gProtocolID;
+ statusInq->protocolIdentifier = gProtocolID;
- OOTRACEDBGA3("Built StatusInquiry (%s, %s)\n", call->callType,
- call->callToken);
+ OOTRACEDBGA3("Built StatusInquiry (%s, %s)\n", call->callType,
+ call->callToken);
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
}
int ooSendReleaseComplete(OOH323CallData *call)
{
- int ret;
+ int ret;
Q931Message *q931msg=NULL;
H225ReleaseComplete_UUIE *releaseComplete;
enum Q931CauseValues cause = Q931ErrorInCauseIE;
call->callType, call->callToken);
ret = ooCreateQ931Message(pctxt, &q931msg, Q931ReleaseCompleteMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR3("Error: In ooCreateQ931Message - H225 Release Complete "
"message(%s, %s)\n", call->callType, call->callToken);
if(call->callState < OO_CALL_CLEAR)
return OO_FAILED;
}
memset(releaseComplete, 0, sizeof(H225ReleaseComplete_UUIE));
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_releaseComplete;
-
+
/* Get cause value and h225 reason code corresponding to OOCallClearReason*/
- ooQ931GetCauseAndReasonCodeFromCallClearReason(call->callEndReason,
+ ooQ931GetCauseAndReasonCodeFromCallClearReason(call->callEndReason,
&cause, &h225ReasonCode);
if (call->q931cause == 0)
call->q931cause = cause;
/* Set Cause IE */
ooQ931SetCauseIE(pctxt, q931msg, call->q931cause, 0, 0);
-
+
/* Set H225 releaseComplete reasonCode */
releaseComplete->m.reasonPresent = TRUE;
releaseComplete->reason.t = h225ReasonCode;
/* Add user-user ie */
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_releaseComplete;
-
- q931msg->userInfo->h323_uu_pdu.h323_message_body.u.releaseComplete =
+
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.u.releaseComplete =
releaseComplete;
releaseComplete->m.callIdentifierPresent = 1;
releaseComplete->protocolIdentifier = gProtocolID;
- releaseComplete->callIdentifier.guid.numocts =
+ releaseComplete->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(releaseComplete->callIdentifier.guid.data,
+ memcpy(releaseComplete->callIdentifier.guid.data,
call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
OOTRACEDBGA3("Built Release Complete message (%s, %s)\n",
call->callType, call->callToken);
- /* Send H225 message */
+ /* Send H225 message */
ret = ooSendH225Msg(call, q931msg);
if(ret != OO_OK)
{
H225VendorIdentifier *vendor;
Q931Message *q931msg=NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
- OOCTXT *pctxt = call->msgctxt;
+ OOCTXT *pctxt = call->msgctxt;
ret = ooCreateQ931Message(pctxt, &q931msg, Q931ConnectMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR1("Error: In allocating memory for - H225 "
"Connect message\n");
return OO_FAILED;
q931msg->callReference = call->callReference;
/* Set bearer capability */
- if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd,
+ if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd,
// Q931TransferUnrestrictedDigital, Q931TransferPacketMode,
// Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725))
Q931TransferSpeech, Q931TransferCircuitMode,
{
OOTRACEERR1("ERROR:Memory - ooAcceptCall - userInfo\n");
return OO_FAILED;
- }
+ }
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=TRUE;
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=TRUE;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG (call->flags, OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG (call->flags, OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_connect;
-
+
connect = (H225Connect_UUIE*)
memAllocZ (pctxt, sizeof(H225Connect_UUIE));
connect->m.maintainConnectionPresent = 1;
connect->multipleCalls = FALSE;
connect->maintainConnection = FALSE;
-
-
+
+
connect->conferenceID.numocts = 16;
for (i = 0; i < 16; i++)
connect->conferenceID.data[i] = i + 1;
connect->m.callIdentifierPresent = 1;
- connect->callIdentifier.guid.numocts =
+ connect->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(connect->callIdentifier.guid.data, call->callIdentifier.guid.data,
+ memcpy(connect->callIdentifier.guid.data, call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
-
+
connect->conferenceID.numocts = call->confIdentifier.numocts;
memcpy(connect->conferenceID.data, call->confIdentifier.data,
call->confIdentifier.numocts);
/* Populate alias addresses */
connect->m.connectedAddressPresent = TRUE;
if(call->ourAliases)
- ret = ooPopulateAliasList(pctxt, call->ourAliases,
+ ret = ooPopulateAliasList(pctxt, call->ourAliases,
&connect->connectedAddress, 0);
else
- ret = ooPopulateAliasList(pctxt, gH323ep.aliases,
+ ret = ooPopulateAliasList(pctxt, gH323ep.aliases,
&connect->connectedAddress, 0);
if(OO_OK != ret)
{
return OO_FAILED;
}
connect->m.presentationIndicatorPresent = TRUE;
- connect->presentationIndicator.t =
+ connect->presentationIndicator.t =
T_H225PresentationIndicator_presentationAllowed;
connect->m.screeningIndicatorPresent = TRUE;
connect->screeningIndicator = userProvidedNotScreened;
- connect->protocolIdentifier = gProtocolID;
+ connect->protocolIdentifier = gProtocolID;
/* Pose as Terminal or Gateway */
if(gH323ep.isGateway)
else
connect->destinationInfo.m.terminalPresent = TRUE;
-
+
connect->destinationInfo.m.vendorPresent = 1;
vendor = &connect->destinationInfo.vendor;
-
+
vendor->vendor.t35CountryCode = gH323ep.t35CountryCode;
vendor->vendor.t35Extension = gH323ep.t35Extension;
vendor->vendor.manufacturerCode = gH323ep.manufacturerCode;
if(gH323ep.productID)
{
vendor->m.productIdPresent = 1;
- vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
+ vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID),
sizeof(vendor->productId.data));
- strncpy((char *)vendor->productId.data, gH323ep.productID,
+ strncpy((char *)vendor->productId.data, gH323ep.productID,
vendor->productId.numocts);
}
if(gH323ep.versionID)
{
vendor->m.versionIdPresent = 1;
- vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
+ vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID),
sizeof(vendor->versionId.data));
- strncpy((char *)vendor->versionId.data, gH323ep.versionID,
- vendor->versionId.numocts);
+ strncpy((char *)vendor->versionId.data, gH323ep.versionID,
+ vendor->versionId.numocts);
}
if (!call->fsSent) {
- ret = ooSetFastStartResponse(call, q931msg,
+ ret = ooSetFastStartResponse(call, q931msg,
&connect->fastStart.n, &connect->fastStart.elem);
if(ret != ASN_OK) { return ret; }
if(connect->fastStart.n > 0) {
of fast-start. why? */
/* May 20110205 */
/* Send h245 listener addr any case if H245 connection isn't established */
- if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) ||
+ if (/* (!OO_TESTFLAG(call->flags, OO_M_FASTSTART) ||
call->remoteFastStartOLCs.count == 0) && */
!OO_TESTFLAG (call->flags, OO_M_TUNNELING) &&
( (!call->h245listener && ooCreateH245Listener(call) == OO_OK) ||
connect->m.h245AddressPresent = TRUE;
if (call->versionIP == 6) {
connect->h245Address.t = T_H225TransportAddress_ip6Address;
-
+
h245Ip6Addr = (H225TransportAddress_ip6Address*)
memAllocZ (pctxt, sizeof(H225TransportAddress_ip6Address));
if(!h245Ip6Addr)
connect->h245Address.u.ip6Address = h245Ip6Addr;
} else {
connect->h245Address.t = T_H225TransportAddress_ipAddress;
-
+
h245IpAddr = (H225TransportAddress_ipAddress*)
memAllocZ (pctxt, sizeof(H225TransportAddress_ipAddress));
if(!h245IpAddr)
memReset(call->msgctxt);
call->callState = OO_CALL_CONNECTED;
-
+
if (call->rtdrCount > 0 && call->rtdrInterval > 0) {
return ooSendRoundTripDelayRequest(call);
}
strcpy(fwdedCall->remoteIP, call->pCallFwdData->ip);
}
fwdedCall->remotePort = call->pCallFwdData->port;
-
+
if(call->pCallFwdData->aliases)
{
alias = call->pCallFwdData->aliases;
for (i = 0; i < 16; i++) {
fwdedCall->confIdentifier.data[i] = irand++;
}
-
+
if(gH323ep.gkClient && !OO_TESTFLAG(fwdedCall->flags, OO_M_DISABLEGK))
{
ooCleanCall(call);
return OO_FAILED;
}
-
+
/* Check whether we have ip address */
if(!ooUtilsIsStrEmpty(tmp)) {
ip = tmp;
for (i = 0; i < 16; i++) {
call->confIdentifier.data[i] = irand++;
}
-
+
if(gH323ep.gkClient && !OO_TESTFLAG(call->flags, OO_M_DISABLEGK))
{
int ooH323CallAdmitted(OOH323CallData *call)
{
int ret=0;
-
+
if(!call)
{
/* Call not supplied. Must locate it in list */
OOTRACEERR1("ERROR: Invalid call parameter to ooH323CallAdmitted");
- return OO_FAILED;
+ return OO_FAILED;
}
if(!strcmp(call->callType, "outgoing")) {
ret = ooCreateH225Connection(call);
if(ret != OO_OK)
{
- OOTRACEERR3("ERROR:Failed to create H225 connection to %s:%d\n",
+ OOTRACEERR3("ERROR:Failed to create H225 connection to %s:%d\n",
call->remoteIP, call->remotePort);
if(call->callState< OO_CALL_CLEAR)
{
if(gH323ep.h323Callbacks.onOutgoingCall) {
/* Outgoing call callback function */
if (gH323ep.h323Callbacks.onOutgoingCall(call) != OO_OK) {
- OOTRACEERR3("ERROR:Failed to setup media to (%s,%d)\n",
+ OOTRACEERR3("ERROR:Failed to setup media to (%s,%d)\n",
call->callType, call->callToken);
if(call->callState< OO_CALL_CLEAR)
{
return OO_FAILED;
}
}
-
+
ret = ooH323MakeCall_helper(call);
- }
- else {
+ }
+ else {
/* incoming call */
if(gH323ep.h323Callbacks.onIncomingCall) {
/* Incoming call callback function */
}
}
}
-
+
return OO_OK;
}
/* pctxt = &gH323ep.msgctxt; */
pctxt = call->msgctxt;
-
+
ret = ooCreateQ931Message(pctxt, &q931msg, Q931SetupMsg);
if(ret != OO_OK)
{
q931msg->callReference = call->callReference;
/* Set bearer capability */
- if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd,
+ if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd,
// Q931TransferUnrestrictedDigital, Q931TransferPacketMode,
call->transfercap, Q931TransferCircuitMode,
// Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725))
if(call->callingPartyNumber && call->callingPartyNumber[0])
ooQ931SetCallingPartyNumberIE(pctxt, q931msg,
(const char*)call->callingPartyNumber, 1, 0, 0, 0);
-
+
/* Set called party number Q931 IE */
if(call->calledPartyNumber)
- ooQ931SetCalledPartyNumberIE(pctxt, q931msg,
+ ooQ931SetCalledPartyNumberIE(pctxt, q931msg,
(const char*)call->calledPartyNumber, 1, 0);
else if(call->remoteAliases) {
pAlias = call->remoteAliases;
}
if(pAlias)
{
- call->calledPartyNumber = (char*)memAlloc(call->pctxt,
+ call->calledPartyNumber = (char*)memAlloc(call->pctxt,
strlen(pAlias->value)+1);
if(!call->calledPartyNumber)
{
OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - "
- "calledPartyNumber(%s, %s)\n", call->callType,
+ "calledPartyNumber(%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
strcpy(call->calledPartyNumber, pAlias->value);
- ooQ931SetCalledPartyNumberIE(pctxt, q931msg,
+ ooQ931SetCalledPartyNumberIE(pctxt, q931msg,
(const char*)call->calledPartyNumber, 1, 0);
}
}
memset (setup, 0, sizeof(H225Setup_UUIE));
setup->protocolIdentifier = gProtocolID;
-
+
/* Populate Alias Address.*/
if(call->ourAliases || gH323ep.aliases)
- {
+ {
setup->m.sourceAddressPresent = TRUE;
if(call->ourAliases)
- ret = ooPopulateAliasList(pctxt, call->ourAliases,
+ ret = ooPopulateAliasList(pctxt, call->ourAliases,
&setup->sourceAddress, 0);
else if(gH323ep.aliases)
- ret = ooPopulateAliasList(pctxt, gH323ep.aliases,
+ ret = ooPopulateAliasList(pctxt, gH323ep.aliases,
&setup->sourceAddress, 0);
if(OO_OK != ret)
{
}
setup->m.presentationIndicatorPresent = TRUE;
- setup->presentationIndicator.t =
+ setup->presentationIndicator.t =
T_H225PresentationIndicator_presentationAllowed;
setup->m.screeningIndicatorPresent = TRUE;
setup->screeningIndicator = userProvidedNotScreened;
if(call->remoteAliases)
{
setup->m.destinationAddressPresent = TRUE;
- ret = ooPopulateAliasList(pctxt, call->remoteAliases,
+ ret = ooPopulateAliasList(pctxt, call->remoteAliases,
&setup->destinationAddress, 0);
if(OO_OK != ret)
{
setup->sourceInfo.vendor.vendor.t35CountryCode = gH323ep.t35CountryCode;
setup->sourceInfo.vendor.vendor.t35Extension = gH323ep.t35Extension;
setup->sourceInfo.vendor.vendor.manufacturerCode= gH323ep.manufacturerCode;
-
+
if(gH323ep.productID)
{
setup->sourceInfo.vendor.m.productIdPresent=TRUE;
setup->sourceInfo.vendor.productId.numocts = ASN1MIN(
- strlen(gH323ep.productID),
+ strlen(gH323ep.productID),
sizeof(setup->sourceInfo.vendor.productId.data));
- strncpy((char*)setup->sourceInfo.vendor.productId.data,
+ strncpy((char*)setup->sourceInfo.vendor.productId.data,
gH323ep.productID, setup->sourceInfo.vendor.productId.numocts);
}
else
setup->sourceInfo.vendor.m.productIdPresent=FALSE;
-
+
if(gH323ep.versionID)
{
setup->sourceInfo.vendor.m.versionIdPresent=TRUE;
setup->sourceInfo.vendor.versionId.numocts = ASN1MIN(
- strlen(gH323ep.versionID),
+ strlen(gH323ep.versionID),
sizeof(setup->sourceInfo.vendor.versionId.data));
- strncpy((char*)setup->sourceInfo.vendor.versionId.data,
+ strncpy((char*)setup->sourceInfo.vendor.versionId.data,
gH323ep.versionID, setup->sourceInfo.vendor.versionId.numocts);
}
else
setup->sourceInfo.vendor.m.versionIdPresent=FALSE;
-
+
setup->sourceInfo.mc = FALSE;
setup->sourceInfo.undefinedNode = FALSE;
if(!destCallSignalIp6Address)
{
OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - "
- "destCallSignal6Address. (%s, %s)\n", call->callType,
+ "destCallSignal6Address. (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
if(!destCallSignalIpAddress)
{
OOTRACEERR3("Error:Memory - ooH323MakeCall_helper - "
- "destCallSignalAddress. (%s, %s)\n", call->callType,
+ "destCallSignalAddress. (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
for(k=0; k< call->capPrefs.index; k++)
{
OOTRACEDBGC5("Preffered capability at index %d is %s. (%s, %s)\n",
- k, ooGetCapTypeText(call->capPrefs.order[k]),
+ k, ooGetCapTypeText(call->capPrefs.order[k]),
call->callType, call->callToken);
if(call->ourCaps) {
epCap = call->ourCaps;
OOTRACEDBGC3("Using call specific capabilities in faststart of "
- "setup message. (%s, %s)\n", call->callType,
+ "setup message. (%s, %s)\n", call->callType,
call->callToken);
}
else{
epCap = gH323ep.myCaps;
OOTRACEDBGC3("Using end-point capabilities for faststart of setup"
- "message. (%s, %s)\n", call->callType,
+ "message. (%s, %s)\n", call->callType,
call->callToken);
}
if(!epCap)
{
OOTRACEWARN4("Warn:Preferred capability %s is abscent in "
- "capability list. (%s, %s)\n",
- ooGetCapTypeText(call->capPrefs.order[k]),
+ "capability list. (%s, %s)\n",
+ ooGetCapTypeText(call->capPrefs.order[k]),
call->callType, call->callToken);
continue;
}
if (epCap->capType == OO_CAP_TYPE_DATA)
continue;
- OOTRACEDBGC4("Building olcs with capability %s. (%s, %s)\n",
- ooGetCapTypeText(epCap->cap), call->callType,
+ OOTRACEDBGC4("Building olcs with capability %s. (%s, %s)\n",
+ ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
if(epCap->dir & OORX)
{
- olc = (H245OpenLogicalChannel*)memAlloc(pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- olc->forwardLogicalChannelNumber = call->logicalChanNoCur++;
+ olc->forwardLogicalChannelNumber = call->logicalChanNoCur++;
if(call->logicalChanNoCur > call->logicalChanNoMax)
call->logicalChanNoCur = call->logicalChanNoBase;
-
+
ooBuildFastStartOLC(call, olc, epCap, pctxt, OORX);
/* Do not specify msg buffer let automatic allocation work */
setPERBuffer(pctxt, NULL, 0, aligned);
return OO_FAILED;
}
finishPrint();
- removeEventHandler(pctxt);
+ removeEventHandler(pctxt);
olc = NULL;
i++;
OOTRACEDBGC5("Added RX fs element %d with capability %s(%s, %s)\n",
- i, ooGetCapTypeText(epCap->cap), call->callType,
+ i, ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
}
if(epCap->dir & OOTX)
{
- olc = (H245OpenLogicalChannel*)memAlloc(pctxt,
+ olc = (H245OpenLogicalChannel*)memAlloc(pctxt,
sizeof(H245OpenLogicalChannel));
if(!olc)
{
return OO_FAILED;
}
memset(olc, 0, sizeof(H245OpenLogicalChannel));
- olc->forwardLogicalChannelNumber = call->logicalChanNoCur++;
+ olc->forwardLogicalChannelNumber = call->logicalChanNoCur++;
if(call->logicalChanNoCur > call->logicalChanNoMax)
call->logicalChanNoCur = call->logicalChanNoBase;
-
+
ooBuildFastStartOLC(call, olc, epCap, pctxt, OOTX);
/* Do not specify msg buffer let automatic allocation work */
setPERBuffer(pctxt, NULL, 0, aligned);
return OO_FAILED;
}
finishPrint();
- removeEventHandler(pctxt);
+ removeEventHandler(pctxt);
olc = NULL;
i++;
OOTRACEDBGC5("Added TX fs element %d with capability %s(%s, %s)\n",
- i, ooGetCapTypeText(epCap->cap), call->callType,
+ i, ooGetCapTypeText(epCap->cap), call->callType,
call->callToken);
}
OOTRACEDBGA4("Added %d fast start elements to SETUP message (%s, %s)\n",
i, call->callType, call->callToken);
setup->fastStart.n = i;
- setup->fastStart.elem = pFS;
+ setup->fastStart.elem = pFS;
}
setup->conferenceID.numocts= call->confIdentifier.numocts;
setup->conferenceGoal.t = T_H225Setup_UUIE_conferenceGoal_create;
/* H.225 point to point call */
setup->callType.t = T_H225CallType_pointToPoint;
-
+
/* Populate optional fields */
setup->m.callIdentifierPresent = TRUE;
/*ooGenerateCallIdentifier(&setup->callIdentifier);*/
setup->callIdentifier.guid.numocts = call->callIdentifier.guid.numocts;
- memcpy(setup->callIdentifier.guid.data, call->callIdentifier.guid.data,
+ memcpy(setup->callIdentifier.guid.data, call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
-
+
setup->m.mediaWaitForConnectPresent = TRUE;
if(OO_TESTFLAG(call->flags, OO_M_MEDIAWAITFORCONN)) {
setup->mediaWaitForConnect = TRUE;
setup->m.canOverlapSendPresent = TRUE;
setup->canOverlapSend = FALSE;
- /* Populate the userInfo structure with the setup UUIE */
-
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ /* Populate the userInfo structure with the setup UUIE */
+
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_setup;
q931msg->userInfo->h323_uu_pdu.h323_message_body.u.setup = setup;
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
-
- q931msg->userInfo->h323_uu_pdu.h245Tunneling =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling =
OO_TESTFLAG (call->flags, OO_M_TUNNELING);
- /* For H.323 version 4 and higher, if fast connect, tunneling should be
+ /* For H.323 version 4 and higher, if fast connect, tunneling should be
supported.
why?
*/
- OOTRACEDBGA3("Built SETUP message (%s, %s)\n", call->callType,
+ OOTRACEDBGA3("Built SETUP message (%s, %s)\n", call->callType,
call->callToken);
-
+
/* H225 message callback */
if(gH323ep.h225Callbacks.onBuiltSetup)
gH323ep.h225Callbacks.onBuiltSetup(call, q931msg);
int ooQ931SendDTMFAsKeyPadIE(OOH323CallData *call, const char* data)
{
- int ret;
+ int ret;
H225Information_UUIE *information=NULL;
Q931Message *q931msg=NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
ret = ooCreateQ931Message(pctxt, &q931msg, Q931InformationMsg);
if(ret != OO_OK)
- {
+ {
OOTRACEERR3("Error: In allocating memory for - H225 Information message."
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
memReset(call->msgctxt);
return OO_FAILED;
}
- q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
- OO_M_TUNNELING);
- q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(call->flags,
+ OO_M_TUNNELING);
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_information;
-
- information = (H225Information_UUIE*)memAllocZ(pctxt,
+
+ information = (H225Information_UUIE*)memAllocZ(pctxt,
sizeof(H225Information_UUIE));
if(!information)
{
memReset(call->msgctxt);
return OO_FAILED;
}
- q931msg->userInfo->h323_uu_pdu.h323_message_body.u.information =
- information;
+ q931msg->userInfo->h323_uu_pdu.h323_message_body.u.information =
+ information;
information->m.callIdentifierPresent = 1;
- information->callIdentifier.guid.numocts =
+ information->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(information->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(information->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
information->protocolIdentifier = gProtocolID;
-
+
/*Add keypad IE*/
ret = ooQ931SetKeypadIE(pctxt, q931msg, data);
if(ret != OO_OK)
{
- OOTRACEERR3("Error:Creating keypad IE for (%s, %s)\n", call->callType,
+ OOTRACEERR3("Error:Creating keypad IE for (%s, %s)\n", call->callType,
call->callToken);
/* memReset(&gH323ep.msgctxt); */
memReset(call->msgctxt);
OOTRACEERR2("ERROR: Invalid call token for forward - %s\n", callToken);
return OO_FAILED;
}
- OOTRACEDBGA3("Building Facility message for call forward (%s, %s)\n",
+ OOTRACEDBGA3("Building Facility message for call forward (%s, %s)\n",
call->callType, call->callToken);
- call->pCallFwdData = (OOCallFwdData*)memAllocZ(call->pctxt,
+ call->pCallFwdData = (OOCallFwdData*)memAllocZ(call->pctxt,
sizeof(OOCallFwdData));
if(!call->pCallFwdData)
{
return OO_FAILED;
}
- ret = ooParseDestination(call, dest, ip, 2+8*4+7,
+ ret = ooParseDestination(call, dest, ip, 2+8*4+7,
&call->pCallFwdData->aliases);
if(ret != OO_OK)
{
sizeof(H225H323_UserInformation));
if(!pQ931Msg->userInfo)
{
- OOTRACEERR3("ERROR:Memory - ooH323ForwardCall - userInfo(%s, %s)\n",
+ OOTRACEERR3("ERROR:Memory - ooH323ForwardCall - userInfo(%s, %s)\n",
call->callType, call->callToken);
return OO_FAILED;
}
memset (pQ931Msg->userInfo, 0, sizeof(H225H323_UserInformation));
- pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
- OO_TESTFLAG (call->flags, OO_M_TUNNELING);
+ pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
+ OO_TESTFLAG (call->flags, OO_M_TUNNELING);
- pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_facility;
-
- facility = (H225Facility_UUIE*)
+
+ facility = (H225Facility_UUIE*)
memAllocZ (pctxt, sizeof(H225Facility_UUIE));
if(!facility)
}
pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.u.facility = facility;
-
- facility->protocolIdentifier = gProtocolID;
+
+ facility->protocolIdentifier = gProtocolID;
facility->m.callIdentifierPresent = 1;
- facility->callIdentifier.guid.numocts =
+ facility->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(facility->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(facility->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
facility->reason.t = T_H225FacilityReason_callForwarded;
-
+
if(!ooUtilsIsStrEmpty(call->pCallFwdData->ip))
{
facility->m.alternativeAddressPresent = TRUE;
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- inet_pton(AF_INET6, call->pCallFwdData->ip,
+ inet_pton(AF_INET6, call->pCallFwdData->ip,
fwdCallSignalIp6Address->ip.data);
fwdCallSignalIp6Address->ip.numocts=16;
"(%s, %s)\n", call->callType, call->callToken);
return OO_FAILED;
}
- inet_pton(AF_INET, call->pCallFwdData->ip,
+ inet_pton(AF_INET, call->pCallFwdData->ip,
fwdCallSignalIpAddress->ip.data);
fwdCallSignalIpAddress->ip.numocts=4;
}
if(call->pCallFwdData->aliases)
- {
+ {
facility->m.alternativeAliasAddressPresent = TRUE;
- ret = ooPopulateAliasList(pctxt, call->pCallFwdData->aliases,
+ ret = ooPopulateAliasList(pctxt, call->pCallFwdData->aliases,
&facility->alternativeAliasAddress, 0);
if(ret != OO_OK)
{
OOTRACEERR3("Error:Failed to populate alternate aliases in "
- "ooH323ForwardCall. (%s, %s)\n", call->callType,
+ "ooH323ForwardCall. (%s, %s)\n", call->callType,
call->callToken);
return OO_FAILED;
}
call= ooFindCallByToken(callToken);
if(!call)
{
- OOTRACEWARN2("WARN: Call hangup failed - Call %s not present\n",
+ OOTRACEWARN2("WARN: Call hangup failed - Call %s not present\n",
callToken);
return OO_FAILED;
}
}
int ooSetBearerCapabilityIE
- (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard,
- enum Q931InformationTransferCapability capability,
+ (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard,
+ enum Q931InformationTransferCapability capability,
enum Q931TransferMode transferMode, enum Q931TransferRate transferRate,
enum Q931UserInfoLayer1Protocol userInfoLayer1)
{
pmsg->bearerCapabilityIE = NULL;
}
- pmsg->bearerCapabilityIE = (Q931InformationElement*)
+ pmsg->bearerCapabilityIE = (Q931InformationElement*)
memAlloc(pctxt, sizeof(Q931InformationElement)+size-1);
if(!pmsg->bearerCapabilityIE)
{
pmsg->bearerCapabilityIE->data[0] = (ASN1OCTET)(0x80 | ((codingStandard&3) << 5) | (capability&31));
pmsg->bearerCapabilityIE->data[1] = (0x80 | ((transferMode & 3) << 5) | (transferRate & 31));
-
+
pmsg->bearerCapabilityIE->data[2] = (0x80 | (1<<5) | userInfoLayer1);
return OO_OK;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
len = strlen(data);
- pmsg->keypadIE = (Q931InformationElement*)
+ pmsg->keypadIE = (Q931InformationElement*)
memAlloc(pctxt, sizeof(Q931InformationElement)+len-1);
if(!pmsg->keypadIE)
{
int ooQ931SetCallingPartyNumberIE
- (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type,
+ (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type,
unsigned presentation, unsigned screening)
{
unsigned len = 0;
}
len = strlen(number);
- pmsg->callingPartyNumberIE = (Q931InformationElement*)
+ pmsg->callingPartyNumberIE = (Q931InformationElement*)
memAlloc(pctxt, sizeof(Q931InformationElement)+len+2-1);
if(!pmsg->callingPartyNumberIE)
{
}
len = strlen(number);
- pmsg->calledPartyNumberIE = (Q931InformationElement*)
+ pmsg->calledPartyNumberIE = (Q931InformationElement*)
memAlloc(pctxt, sizeof(Q931InformationElement)+len+1-1);
if(!pmsg->calledPartyNumberIE)
{
pmsg->callstateIE = NULL;
}
- pmsg->callstateIE = (Q931InformationElement*)
+ pmsg->callstateIE = (Q931InformationElement*)
memAllocZ(pctxt, sizeof(Q931InformationElement));
if(!pmsg->callstateIE)
{
pmsg->callstateIE->discriminator = Q931CallStateIE;
pmsg->callstateIE->length = 1;
pmsg->callstateIE->data[0] = callstate;
-
+
return OO_OK;
}
int ooQ931SetCauseIE
- (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding,
+ (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding,
unsigned location)
{
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
pmsg->causeIE = NULL;
}
- pmsg->causeIE = (Q931InformationElement*)
+ pmsg->causeIE = (Q931InformationElement*)
memAlloc(pctxt, sizeof(Q931InformationElement)+1);
if(!pmsg->causeIE)
{
pmsg->causeIE->data[0] = (0x80 | ((coding & 0x03) <<5) | (location & 0x0F));
pmsg->causeIE->data[1] = (0x80 | cause);
-
+
return OO_OK;
}
/* Build a Facility message and tunnel H.245 message through it */
-int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf,
+int ooSendAsTunneledMessage(OOH323CallData *call, ASN1OCTET* msgbuf,
int h245Len, int h245MsgType, int associatedChan)
{
Q931Message *pQ931Msg = NULL;
/* OOCTXT *pctxt = &gH323ep.msgctxt; */
OOCTXT *pctxt = call->msgctxt;
- OOTRACEDBGA4("Building Facility message for tunneling %s (%s, %s)\n",
+ OOTRACEDBGA4("Building Facility message for tunneling %s (%s, %s)\n",
ooGetMsgTypeText(h245MsgType), call->callType, call->callToken);
ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg);
return OO_FAILED;
}
memset (pQ931Msg->userInfo, 0, sizeof(H225H323_UserInformation));
- pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
+ pQ931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1;
- pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
+ pQ931Msg->userInfo->h323_uu_pdu.h245Tunneling =
OO_TESTFLAG (call->flags, OO_M_TUNNELING);
- pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
+ pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.t =
T_H225H323_UU_PDU_h323_message_body_facility;
-
+
facility = (H225Facility_UUIE*)
memAllocZ (pctxt, sizeof(H225Facility_UUIE));
pQ931Msg->userInfo->h323_uu_pdu.h323_message_body.u.facility = facility;
/* Populate Facility UUIE */
- facility->protocolIdentifier = gProtocolID;
+ facility->protocolIdentifier = gProtocolID;
facility->m.callIdentifierPresent = 1;
- facility->callIdentifier.guid.numocts =
+ facility->callIdentifier.guid.numocts =
call->callIdentifier.guid.numocts;
- memcpy(facility->callIdentifier.guid.data,
- call->callIdentifier.guid.data,
+ memcpy(facility->callIdentifier.guid.data,
+ call->callIdentifier.guid.data,
call->callIdentifier.guid.numocts);
facility->reason.t = T_H225FacilityReason_transportedInformation;
pH245Control = (H225H323_UU_PDU_h245Control*)
&pH323UUPDU->h245Control;
- elem = (ASN1DynOctStr*) memAlloc(pctxt,
+ elem = (ASN1DynOctStr*) memAlloc(pctxt,
sizeof(ASN1DynOctStr));
if(!elem)
{
pQ931Msg->tunneledMsgType = h245MsgType;
pQ931Msg->logicalChannelNo = associatedChan;
-
+
ret = ooSendH225Msg(call, pQ931Msg);
if(ret != OO_OK)
{
"outbound queue.(%s, %s)\n", call->callType, call->callToken);
}
- /* Can't do memReset here because if we are sending H.245 message as a
+ /* Can't do memReset here because if we are sending H.245 message as a
response to received tunneled h.245 message, we can't reset unless the \
main received H225 message processing is finished. Rule. No reset when
tunneling
ooTimerCallback *cbData = (ooTimerCallback*) data;
OOH323CallData *call = cbData->call;
- OOTRACEINFO3("Call Establishment timer expired. (%s, %s)\n",
- call->callType, call->callToken);
+ OOTRACEINFO3("Call Establishment timer expired. (%s, %s)\n",
+ call->callType, call->callToken);
memFreePtr(call->pctxt, cbData);
if(call->callState < OO_CALL_CLEAR){
call->callState = OO_CALL_CLEAR;
- call->callEndReason = OO_REASON_LOCAL_CLEARED;
+ call->callEndReason = OO_REASON_LOCAL_CLEARED;
}
return OO_OK;
int ooQ931GetCauseAndReasonCodeFromCallClearReason
- (OOCallClearReason clearReason, enum Q931CauseValues *cause,
+ (OOCallClearReason clearReason, enum Q931CauseValues *cause,
unsigned *reasonCode)
{
switch(clearReason)
break;
case OO_REASON_GK_NOCALLERUSER:
*reasonCode = T_H225ReleaseCompleteReason_callerNotRegistered;
- *cause = Q931SubscriberAbsent;
+ *cause = Q931SubscriberAbsent;
break;
case OO_REASON_GK_UNREACHABLE:
*reasonCode = T_H225ReleaseCompleteReason_unreachableGatekeeper;
*cause = Q931NoRouteToDestination;
break;
case OO_REASON_NOUSER:
- *reasonCode = T_H225ReleaseCompleteReason_undefinedReason;
+ *reasonCode = T_H225ReleaseCompleteReason_undefinedReason;
*cause = Q931SubscriberAbsent;
break;
case OO_REASON_UNKNOWN:
parsedIP[0] = '\0';
OOTRACEINFO2("Parsing destination %s\n", dest);
-
+
/* Test for an IP address:Note that only supports dotted IPv4.
IPv6 won't pass the test and so will numeric IP representation*/
-
+
sscanf(dest, "%d.%d.%d.%d:%d", &iEk, &iDon, &iTeen, &iChaar, &iPort);
if((iEk > 0 && iEk <= 255) &&
(iDon >= 0 && iDon <= 255) &&
"ooParseDestination\n");
return OO_FAILED;
}
-
+
strcpy(parsedIP, buf);
return OO_OK;
}
}
}
-
+
/* e-164 */
/* strspn(dest, "1234567890*#,") == strlen(dest)*/
/* Dialed digits test*/
for(i=0; *(alias+i) != '\0'; i++)
{
- if(!isdigit(alias[i]) && alias[i] != '#' && alias[i] != '*' &&
+ if(!isdigit(alias[i]) && alias[i] != '#' && alias[i] != '*' &&
alias[i] != ',')
break;
}
{
switch(val)
{
- case Q931UnallocatedNumber:
+ case Q931UnallocatedNumber:
return "Q931UnallocatedNumber";
case Q931NoRouteToNetwork:
return "Q931NoRouteToNetwork";
case Q931NoRouteToDestination:
return "Q931NoRouteToDestination";
- case Q931ChannelUnacceptable:
+ case Q931ChannelUnacceptable:
return "Q931ChannelUnacceptable";
case Q931NormalCallClearing:
return "Q931NormalCallClearing";
}
return "Unsupported Cause Type";
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ooq931.h
- * This file contains functions to support call signalling.
+ * @file ooq931.h
+ * This file contains functions to support call signalling.
*/
#ifndef _OOQ931HDR_H_
#endif /* MAKE_DLL */
#endif /* EXTERN */
-/**
+/**
* @defgroup q931 Q.931/H.2250 Message Handling
* @{
*/
#define OO_MAX_CALL_TOKEN 999999
/* Q.931 packet must be at least 5 bytes long */
-#define Q931_E_TOOSHORT (-1001)
+#define Q931_E_TOOSHORT (-1001)
/* callReference field must be 2 bytes long */
-#define Q931_E_INVCALLREF (-1002)
+#define Q931_E_INVCALLREF (-1002)
/* invalid length of message */
-#define Q931_E_INVLENGTH (-1003)
+#define Q931_E_INVLENGTH (-1003)
enum Q931MsgTypes {
Q931NationalEscapeMsg = 0x00,
/*
Structure to build store outgoing encoded UUIE
- The different fields in the structure have octet lengths
- as specified in the spec.
+ The different fields in the structure have octet lengths
+ as specified in the spec.
*/
typedef struct Q931InformationElement {
int discriminator;
} Q931InformationElement;
/**
- * Q.931 message structure. Contains context for memory allocation,
- * protocol discriminator, call reference, meesage type and list of
+ * Q.931 message structure. Contains context for memory allocation,
+ * protocol discriminator, call reference, meesage type and list of
* user-user information elements (IEs).
*/
typedef struct Q931Message {
ASN1UINT tunneledMsgType; /* The H245 message this message is tunneling*/
ASN1INT logicalChannelNo; /* channel number associated with tunneled */
/* message, 0 if no channel */
- DList ies;
+ DList ies;
Q931InformationElement *bearerCapabilityIE;
Q931InformationElement *callingPartyNumberIE;
Q931InformationElement *calledPartyNumberIE;
/*
* These are message callbacks which can be used by user applications
- * to perform application specific things on receiving a particular
+ * to perform application specific things on receiving a particular
* message or before sending a particular message. For ex. user application
* can change values of some parameters of setup message before it is actually
* sent out.
*/
/**
- * This callback is triggered when an H.225 SETUP message is received by
+ * This callback is triggered when an H.225 SETUP message is received by
* the application.
* @param call The call the message is associated with.
* @param pmsg Q.931 message structure.
(struct OOH323CallData *call, struct Q931Message *pmsg);
/**
- * This callback is triggered when an H.225 CONNECT message is received by
+ * This callback is triggered when an H.225 CONNECT message is received by
* the application.
* @param call The call the message is associated with.
* @param pmsg Q.931 message structure.
(struct OOH323CallData *call, struct Q931Message *pmsg);
/**
- * This callback is triggered after an H.225 SETUP message has been
- * constructed and is ready to be sent out. It provides the application
+ * This callback is triggered after an H.225 SETUP message has been
+ * constructed and is ready to be sent out. It provides the application
* with an opportunity to add additional non-standard information.
* @param call The call the message is associated with.
* @param pmsg Q.931 message structure.
(struct OOH323CallData *call, struct Q931Message *pmsg);
/**
- * This callback is triggered after an H.225 CONNECT message has been
- * constructed and is ready to be sent out. It provides the application
+ * This callback is triggered after an H.225 CONNECT message has been
+ * constructed and is ready to be sent out. It provides the application
* with an opportunity to add additional non-standard information.
* @param call The call the message is associated with.
* @param pmsg Q.931 message structure.
(struct OOH323CallData *call, struct Q931Message *pmsg);
/**
- * This structure holds the various callback functions that are
+ * This structure holds the various callback functions that are
* triggered when H.225 messages are received or constructed.
* @see ooH323EpSetH225MsgCallbacks
*/
} OOH225MsgCallbacks;
/**
- * This function is invoked to decode a Q931 message.
- *
+ * This function is invoked to decode a Q931 message.
+ *
* @param call Handle to call which owns the message.
* @param msg Pointer to the Q931 message
* @param length Length of the encoded data
*
* @return Completion status - 0 on success, -1 on failure
*/
-EXTERN int ooQ931Decode
+EXTERN int ooQ931Decode
(struct OOH323CallData *call, Q931Message* msg, int length, ASN1OCTET *data, int docallbacks);
/**
* This function is used to decode the UUIE of the message from the list of
* ies. It decodes the User-User ie and populates the userInfo field of the
* message.
- * @param q931Msg Pointer to the message whose User-User ie has to be
- * decoded.
+ * @param q931Msg Pointer to the message whose User-User ie has to be
+ * decoded.
*
* @return OO_OK, on success. OO_FAILED, on failure.
- */
+ */
EXTERN int ooDecodeUUIE(OOCTXT* pctxt, Q931Message *q931Msg);
/**
EXTERN int ooEncodeUUIE(OOCTXT* pctxt, Q931Message *q931msg);
/**
- * This function is invoked to retrieve an IE element from a Q931 message.
- *
+ * This function is invoked to retrieve an IE element from a Q931 message.
+ *
* @param q931msg Pointer to the Q931 message
* @param ieCode IE code for the IE element to be retrieved
*
- * @return Pointer to a Q931InformationElement contating
+ * @return Pointer to a Q931InformationElement contating
* the IE element.
*/
-EXTERN Q931InformationElement* ooQ931GetIE (const Q931Message* q931msg,
+EXTERN Q931InformationElement* ooQ931GetIE (const Q931Message* q931msg,
int ieCode);
/**
- * This function is invoked to print a Q931 message.
- *
+ * This function is invoked to print a Q931 message.
+ *
* @param q931msg Pointer to the Q931 message
*
* @return - none
/**
- * This function is invoked to create an outgoing Q931 message.
- *
+ * This function is invoked to create an outgoing Q931 message.
+ *
* @param msg Reference to the pointer of type Q931 message.
* @param msgType Type of Q931 message to be created
*
EXTERN int ooCreateQ931Message(OOCTXT* pctxt, Q931Message **msg, int msgType);
/**
- * This function is invoked to generate a unique call reference number.
+ * This function is invoked to generate a unique call reference number.
*
* @return - call reference number
*/
EXTERN int ooGenerateCallIdentifier(H225CallIdentifier *callid);
/**
- * This function is invoked to release the memory used up by a Q931 message
- *
+ * This function is invoked to release the memory used up by a Q931 message
+ *
* @param q931Msg Pointer to a Q931 message which has to be freed.
*
* @return Completion status - 0 on success, -1 on failure
EXTERN int ooFreeQ931Message(OOCTXT* pctxt, Q931Message *q931Msg);
/**
- * This function is invoked to retrive the outgoing message buffer for
+ * This function is invoked to retrive the outgoing message buffer for
* Q931 message
*
- * @param call Pointer to call for which outgoing Q931 message has to be
+ * @param call Pointer to call for which outgoing Q931 message has to be
* retrieved.
* @param msgbuf Pointer to a buffer in which retrieved message will
* be returned.
(struct OOH323CallData *call, ASN1OCTET * msgbuf, int* len, int *msgType);
/**
- * This function is invoked to send a ReleaseComplete message for
+ * This function is invoked to send a ReleaseComplete message for
* the currently active call.
*
- * @param call Pointer to the call for which ReleaseComplete message have
- * to be sent.
+ * @param call Pointer to the call for which ReleaseComplete message have
+ * to be sent.
*
* @return Completion status - 0 on success, -1 on failure
*/
* received setup message.
*
* @param call Pointer to the call for which CallProceeding message have to
- * be sent.
+ * be sent.
*
* @return Completion status - 0 on success, -1 on failure
*/
EXTERN int ooSendCallProceeding(struct OOH323CallData *call);
/**
- * This function is invoked to send alerting message in response to received
- * setup message.
+ * This function is invoked to send alerting message in response to received
+ * setup message.
*
- * @param call Pointer to the call for which Alerting message have to be
- * sent.
+ * @param call Pointer to the call for which Alerting message have to be
+ * sent.
*
* @return Completion status - 0 on success, -1 on failure
*/
/**
* This function is invoked to send Facility message.
*
- * @param call Pointer to the call for which Facility message have to be
- * sent.
+ * @param call Pointer to the call for which Facility message have to be
+ * sent.
*
* @return Completion status - 0 on success, -1 on failure
*/
(struct OOH323CallData *call, const char* data);
/**
- * This function is invoked to send a Connect message in response to received
- * setup message.
+ * This function is invoked to send a Connect message in response to received
+ * setup message.
*
- * @param call Pointer to the call for which connect message has to be
- * sent.
+ * @param call Pointer to the call for which connect message has to be
+ * sent.
*
* @return Completion status - 0 on success, -1 on failure
*/
/**
* This function is used to send a SETUP message for outgoing call. It first
- * creates an H.225 TCP connection with the remote end point and then sends
+ * creates an H.225 TCP connection with the remote end point and then sends
* SETUP message over this connection.
* @param dest Destination - IP:Port/alias.
* @param callToken Unique token for the new call.
/**
* This function is used for forwarding/redirecting a call to third party.
* @param callToken callToken for the call which has to be redirected.
- * @param dest Address to which call has to be forwarded. Can be
+ * @param dest Address to which call has to be forwarded. Can be
* IP:Port or alias.
*
* @return OO_OK, on success. OO_FAILED, on failure.
EXTERN int ooH323HangCall(char * callToken, OOCallClearReason reason, int q931);
-/**
+/**
* Function to accept a call by sending connect. This function is used
* as a helper function to ooSendConnect.
* @param call Pointer to the call for which connect has to be sent
/**
- * This function sends an encoded H.245 message buffer as a tunneled
+ * This function sends an encoded H.245 message buffer as a tunneled
* H.245 Facility message.
* @param call Pointer to the call for which H.245 message has to
* be tunneled.
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooSendAsTunneledMessage
-(struct OOH323CallData *call, ASN1OCTET* msgbuf,
- int h245Len, int h245MsgType, int associatedChan);
-
+(struct OOH323CallData *call, ASN1OCTET* msgbuf,
+ int h245Len, int h245MsgType, int associatedChan);
+
/**
* This function is used to encode an H.225 message.
* @param call Handle to the call.
* @param pq931Msg Pointer to the message to be encoded.
- * @param msgbuf Pointer to the buffer in which encoded message will
+ * @param msgbuf Pointer to the buffer in which encoded message will
* be returned.
* @param size Size of the buffer passed.
*
* @return OO_OK, on success. OO_FAILED, on failure.
*/
-int ooEncodeH225Message(struct OOH323CallData *call, Q931Message *pq931Msg,
+int ooEncodeH225Message(struct OOH323CallData *call, Q931Message *pq931Msg,
char *msgbuf, int size);
/**
- * This is a callback function which is called when there is no CONNECT
+ * This is a callback function which is called when there is no CONNECT
* response from the remote endpoint after the SETUP has been sent and timeout
* period has passed.
- * @param data The callback data registered at the time of timer
+ * @param data The callback data registered at the time of timer
* creation.
*
* @return OO_OK, on success. OO_FAILED, on failure.
* @return OO_OK on success, OO_FAILED, on failure.
*/
EXTERN int ooSetBearerCapabilityIE
- (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard,
- enum Q931InformationTransferCapability capability,
+ (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard,
+ enum Q931InformationTransferCapability capability,
enum Q931TransferMode transferMode, enum Q931TransferRate transferRate,
enum Q931UserInfoLayer1Protocol userInfoLayer1);
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooQ931SetCallingPartyNumberIE
- (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type,
+ (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type,
unsigned presentation, unsigned screening);
-/**
+/**
* This function is used to set a cause ie for a q931 message.
* @param pmsg Valid Q931 Message
* @param cause Q931 Cause Value
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooQ931SetCauseIE
- (OOCTXT *pctxt, Q931Message *pmsg,enum Q931CauseValues cause, unsigned coding,
+ (OOCTXT *pctxt, Q931Message *pmsg,enum Q931CauseValues cause, unsigned coding,
unsigned location);
EXTERN int ooQ931SetCallStateIE
(OOCTXT *pctxt, Q931Message *pmsg, unsigned char callstate);
/**
- * This function is used to convert a call clear reason to cause and
- * reason code. It is used when local user is endoing the call and
+ * This function is used to convert a call clear reason to cause and
+ * reason code. It is used when local user is endoing the call and
* sending releaseComplete.
* @param clearReason Reason for ending call.
* @param cause Pointer to Q931CauseVaules enum in which cause
* @return OO_OK, on success. OO_FAILED, on failure.
*/
EXTERN int ooQ931GetCauseAndReasonCodeFromCallClearReason
- (OOCallClearReason clearReason, enum Q931CauseValues *cause,
+ (OOCallClearReason clearReason, enum Q931CauseValues *cause,
unsigned *reasonCode);
/**
(enum Q931CauseValues cause, unsigned reasonCode);
/**
- * This function is used to retrieve the description text for a
+ * This function is used to retrieve the description text for a
* message type.
*
* @param msgType Message type.
EXTERN int ooSendFSUpdate(struct OOH323CallData *call);
EXTERN int ooHandleFastStartChannels(struct OOH323CallData *pCall);
-/**
- * @}
+/**
+ * @}
*/
#ifdef __cplusplus
}
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
if(traceLevel > gs_traceLevel) return;
va_start (arglist, fmtspec);
/* memset(logMessage, 0, MAXLOGMSGLEN);*/
- vsprintf(logMessage, fmtspec, arglist);
+ vsprintf(logMessage, fmtspec, arglist);
va_end(arglist);
ooTraceLogMessage(logMessage);
}
static int lasttime=25;
int printDate =0;
static int printTime=1;
-
+
#ifdef _WIN32
-
+
SYSTEMTIME systemTime;
GetLocalTime(&systemTime);
- GetTimeFormat(LOCALE_SYSTEM_DEFAULT,0, &systemTime, "HH':'mm':'ss",
+ GetTimeFormat(LOCALE_SYSTEM_DEFAULT,0, &systemTime, "HH':'mm':'ss",
timeString, 100);
GetTimeFormat(LOCALE_SYSTEM_DEFAULT,0, &systemTime, "H", currtime, 3);
if(lasttime> atoi(currtime))
printDate=1;
lasttime = atoi(currtime);
-
+
#else
struct tm *ptime;
char dateString[10];
strftime(currtime, 3, "%H", ptime);
if(lasttime>atoi(currtime))
printDate = 1;
- lasttime = atoi(currtime);
+ lasttime = atoi(currtime);
#endif
-
+
#ifdef _WIN32
if(printDate)
{
systemTime.wMonth, systemTime.wDay, systemTime.wYear);
}
if(printTime) {
- fprintf(gH323ep.fptraceFile, "%s:%03d %s", timeString,
+ fprintf(gH323ep.fptraceFile, "%s:%03d %s", timeString,
systemTime.wMilliseconds, logMessage);
}
else
fprintf(gH323ep.fptraceFile, "%s", logMessage);
-
+
fflush(gH323ep.fptraceFile);
#else
if(printDate)
{
printDate = 0;
strftime(dateString, 10, "%d", ptime);
- fprintf(gH323ep.fptraceFile, "---------Date %s---------\n",
+ fprintf(gH323ep.fptraceFile, "---------Date %s---------\n",
dateString);
}
if(printTime) {
struct timeval systemTime;
gettimeofday(&systemTime, NULL);
- fprintf(gH323ep.fptraceFile, "%s:%03ld %s", timeString,
+ fprintf(gH323ep.fptraceFile, "%s:%03ld %s", timeString,
(long) systemTime.tv_usec/1000, logMessage);
}
else
fflush(gH323ep.fptraceFile);
#endif
-
+
if(strchr(logMessage, '\n'))
printTime = 1;
else
OOTRACEERR4("Asn1Error: %d at %s:%d\n", stat, fname, lno);
return stat;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- * @file ootrace.h
+ * @file ootrace.h
* This file defines the trace functionality
*/
#include "ooCommon.h"
#define OOTRACEINFO4(a,b,c,d) ooTrace(OOTRCLVLINFO,a,b,c,d)
#define OOTRACEINFO5(a,b,c,d,e) ooTrace(OOTRCLVLINFO,a,b,c,d,e)
#define OOTRACEINFO6(a,b,c,d,e,f) ooTrace(OOTRCLVLINFO,a,b,c,d,e, f)
-#ifndef _COMPACT
+#ifndef _COMPACT
#define OOTRACEDBGA1(a) ooTrace(OOTRCLVLDBGA,a)
#define OOTRACEDBGA2(a,b) ooTrace(OOTRCLVLDBGA,a,b)
#define OOTRACEDBGA3(a,b,c) ooTrace(OOTRCLVLDBGA,a,b,c)
#define OOTRACEDBGC4(a,b,c,d) ooTrace(OOTRCLVLDBGC,a,b,c,d)
#define OOTRACEDBGC5(a,b,c,d,e) ooTrace(OOTRCLVLDBGC,a,b,c,d,e)
#else
-#define OOTRACEDBGA1(a)
+#define OOTRACEDBGA1(a)
#define OOTRACEDBGA2(a,b)
#define OOTRACEDBGA3(a,b,c)
#define OOTRACEDBGA4(a,b,c,d)
#define OOTRACEDBGA5(a,b,c,d,e)
#define OOTRACEDBGB1(a)
-#define OOTRACEDBGB2(a,b)
+#define OOTRACEDBGB2(a,b)
#define OOTRACEDBGB3(a,b,c)
#define OOTRACEDBGB4(a,b,c,d)
#define OOTRACEDBGC1(a)
/**
* This function is used to set the trace level.
- * @param traceLevel New trace level. Various values are: OOTRCLVLERR,
+ * @param traceLevel New trace level. Various values are: OOTRCLVLERR,
* OOTRCLVLWARN, OOTRCLVLINFO, OOTRCLVLDBGA, OOTRCLVLDBGB,
* OOTRCLVLDBGC
*
- * @return None
+ * @return None
*/
EXTERN void ooSetTraceThreshold(OOUINT32 traceLevel);
*
* @param traceLevel Trace level for the message.
* @param fmtspec Printf style format spec.
- * @param ... Printf style variable list of arguments
+ * @param ... Printf style variable list of arguments
*
* @return - none
*/
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/*! \mainpage
+/*! \mainpage
* <H1>ooH323c Stack Functions</H1>
*
- * The <B>Objective Open H.323 for C (ooH323c)</B> protocol stack is an
- * open source applications program interface (API) for building H.323 based
- * applications. The stack implements Q.931/H.225 call signaling procedures,
- * H.245 logical channel operations, and Registration, Admission, and Status
+ * The <B>Objective Open H.323 for C (ooH323c)</B> protocol stack is an
+ * open source applications program interface (API) for building H.323 based
+ * applications. The stack implements Q.931/H.225 call signaling procedures,
+ * H.245 logical channel operations, and Registration, Admission, and Status
* (RAS) messaging for Gatekeeper communications.
*
* The categories of user functions provided are as follows:
* <UL>
- * <LI>Stack command functions. These are high level functions used to
- * initiate common H.323 telephony operations (for example, to make a
+ * <LI>Stack command functions. These are high level functions used to
+ * initiate common H.323 telephony operations (for example, to make a
* call).</LI>
- * <LI>Gatekeeper functions. These are high level functions for
+ * <LI>Gatekeeper functions. These are high level functions for
* managing communications with a gatekeeper using RAS messages.</LI>
- * <LI>H.323 endpoint management functions. These are function for
+ * <LI>H.323 endpoint management functions. These are function for
* used for managing the global H.323 endpoint.</LI>
- * <LI>Call management functions. These are functions used to manage
+ * <LI>Call management functions. These are functions used to manage
* active calls within the stack.</LI>
- * <LI>Capability management functions. These functions are used for
+ * <LI>Capability management functions. These functions are used for
* negotiating capabilities between two different terminals.</LI>
- * <LI>H.225 and H.245 message handling functions. Functions for
+ * <LI>H.225 and H.245 message handling functions. Functions for
* creating and handling H.323 standard ASN.1 messages.</LI>
- * <LI>Q.931 functions. Functions for the execution of various
+ * <LI>Q.931 functions. Functions for the execution of various
* standard Q.931 operations.</LI>
- * <LI>TCP/IP and UDP socket communication functions. Low-level
+ * <LI>TCP/IP and UDP socket communication functions. Low-level
* functions for writing data to and receiving data from sockets.</LI>
* </UL>
- */
+ */
/**
- * @file ootypes.h
+ * @file ootypes.h
* This file contains definitions of common constants and data structures.
*/
#ifndef _OOTYPES_H_
#endif /* MAKE_DLL */
#endif /* EXTERN */
-/**
+/**
* @defgroup ootypes Common type and constant definitions.
* @{
*/
*/
typedef enum OOMasterSlaveState {
OO_MasterSlave_Idle,
- OO_MasterSlave_DetermineSent,
+ OO_MasterSlave_DetermineSent,
OO_MasterSlave_AckReceived,
OO_MasterSlave_Master,
OO_MasterSlave_Slave
OO_msAck_remoteReceived
} OOMSAckStatus;
-/**
- * States defined for the capability exchange procedure.
+/**
+ * States defined for the capability exchange procedure.
*/
typedef enum {
- OO_LocalTermCapExchange_Idle,
- OO_LocalTermCapSetSent,
- OO_LocalTermCapSetAckRecvd,
- OO_RemoteTermCapExchange_Idle,
- OO_RemoteTermCapSetRecvd,
+ OO_LocalTermCapExchange_Idle,
+ OO_LocalTermCapSetSent,
+ OO_LocalTermCapSetAckRecvd,
+ OO_RemoteTermCapExchange_Idle,
+ OO_RemoteTermCapSetRecvd,
OO_RemoteTermCapSetAckSent
} OOCapExchangeState;
-/**
+/**
* Call clear reason codes.
*/
typedef enum OOCallClearReason {
- OO_REASON_UNKNOWN=0,
+ OO_REASON_UNKNOWN=0,
OO_REASON_INVALIDMESSAGE,
- OO_REASON_TRANSPORTFAILURE,
+ OO_REASON_TRANSPORTFAILURE,
OO_REASON_NOROUTE,
OO_REASON_NOUSER,
OO_REASON_NOBW,
OO_REASON_GK_UNREACHABLE,
OO_REASON_GK_CLEARED,
OO_REASON_NOCOMMON_CAPABILITIES,
- OO_REASON_REMOTE_FWDED,
+ OO_REASON_REMOTE_FWDED,
OO_REASON_LOCAL_FWDED,
- OO_REASON_REMOTE_CLEARED,
- OO_REASON_LOCAL_CLEARED,
+ OO_REASON_REMOTE_CLEARED,
+ OO_REASON_LOCAL_CLEARED,
OO_REASON_REMOTE_BUSY,
OO_REASON_LOCAL_BUSY,
OO_REASON_REMOTE_NOANSWER,
/*TODO: Should add caller-id, callername etc. So that they can be changed per
call basis*/
/**
- * This structure defines options that can be set at the level of an
- * individual call. They override options set in the H.323 endpoint
+ * This structure defines options that can be set at the level of an
+ * individual call. They override options set in the H.323 endpoint
* structure.
*/
typedef struct ooCallOptions {
OOCallMode callMode; /*!< Type of channel to setup with FastStart */
int transfercap; /* q931 cap */
}ooCallOptions;
-
+
struct OOH323CallData;
* @}
*/
#endif
-
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
ASN1BOOL isExtendableSize (Asn1SizeCnst* pSizeList);
static ASN1BOOL isFixedSize (Asn1SizeCnst* pSizeList);
-ASN1BOOL alignCharStr
+ASN1BOOL alignCharStr
(OOCTXT* pctxt, ASN1UINT len, ASN1UINT nbits, Asn1SizeCnst* pSize)
{
if (TRUE) {
return FALSE;
}
-int bitAndOctetStringAlignmentTest (Asn1SizeCnst* pSizeList,
- ASN1UINT itemCount,
+int bitAndOctetStringAlignmentTest (Asn1SizeCnst* pSizeList,
+ ASN1UINT itemCount,
ASN1BOOL bitStrFlag,
ASN1BOOL* pAlignFlag)
{
ASN1UINT threshold = (bitStrFlag) ? 16 : 2;
- if (pSizeList == 0 || itemCount > threshold)
+ if (pSizeList == 0 || itemCount > threshold)
*pAlignFlag = TRUE;
- else if (isFixedSize(pSizeList))
+ else if (isFixedSize(pSizeList))
*pAlignFlag = FALSE;
else {
return (ASN_OK);
}
-Asn1SizeCnst* checkSize (Asn1SizeCnst* pSizeList,
- ASN1UINT value,
+Asn1SizeCnst* checkSize (Asn1SizeCnst* pSizeList,
+ ASN1UINT value,
ASN1BOOL* pExtendable)
{
Asn1SizeCnst* lpSize = pSizeList;
lpSize = pSize;
while (lpSize) {
if (pctxt->pSizeConstraint->lower <= lpSize->lower ||
- pctxt->pSizeConstraint->upper >= lpSize->upper)
+ pctxt->pSizeConstraint->upper >= lpSize->upper)
{
/* Set the extension flag to the value of the size */
/* constraint structure that the item falls within.. */
}
ASN1UINT getUIntBitCount (ASN1UINT value)
-{
+{
/* Binary search - decision tree (5 tests, rarely 6) */
return
((value < 1<<15) ?
((value < 1<<7) ?
((value < 1<<3) ?
- ((value < 1<<1) ? ((value < 1<<0) ? 0 : 1) :
+ ((value < 1<<1) ? ((value < 1<<0) ? 0 : 1) :
((value < 1<<2) ? 2 : 3)) :
- ((value < 1<<5) ? ((value < 1<<4) ? 4 : 5) :
+ ((value < 1<<5) ? ((value < 1<<4) ? 4 : 5) :
((value < 1<<6) ? 6 : 7))) :
((value < 1<<11) ?
- ((value < 1<<9) ? ((value < 1<<8) ? 8 : 9) :
+ ((value < 1<<9) ? ((value < 1<<8) ? 8 : 9) :
((value < 1<<10) ? 10 : 11)) :
- ((value < 1<<13) ? ((value < 1<<12) ? 12 : 13) :
+ ((value < 1<<13) ? ((value < 1<<12) ? 12 : 13) :
((value < 1<<14) ? 14 : 15)))) :
((value < 1<<23) ?
((value < 1<<19) ?
- ((value < 1<<17) ? ((value < 1<<16) ? 16 : 17) :
+ ((value < 1<<17) ? ((value < 1<<16) ? 16 : 17) :
((value < 1<<18) ? 18 : 19)) :
- ((value < 1<<21) ? ((value < 1<<20) ? 20 : 21) :
+ ((value < 1<<21) ? ((value < 1<<20) ? 20 : 21) :
((value < 1<<22) ? 22 : 23))) :
((value < 1<<27) ?
- ((value < 1<<25) ? ((value < 1<<24) ? 24 : 25) :
+ ((value < 1<<25) ? ((value < 1<<24) ? 24 : 25) :
((value < 1<<26) ? 26 : 27)) :
- ((value < 1<<29) ? ((value < 1<<28) ? 28 : 29) :
- ((value < 1<<30) ? 30 :
+ ((value < 1<<29) ? ((value < 1<<28) ? 28 : 29) :
+ ((value < 1<<30) ? 30 :
((value < 1UL<<31) ? 31 : 32))))));
}
return FALSE;
}
-void set16BitCharSet
+void set16BitCharSet
(OOCTXT* pctxt, Asn116BitCharSet* pCharSet, Asn116BitCharSet* pAlphabet)
{
/* Permitted alphabet range can either be specified as a range of */
int nocts = pAlphabet->charSet.nchars * 2;
pCharSet->charSet.nchars = pAlphabet->charSet.nchars;
- pCharSet->charSet.data =
+ pCharSet->charSet.data =
(ASN116BITCHAR*) ASN1MALLOC (pctxt, nocts);
if (pCharSet->charSet.data != NULL)
pCharSet->alignedBits <<= 1;
}
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/* This is an implementation of a simple print handler. It outputs
- the fields of an encoded PER message to stdout in a structured output
+/* This is an implementation of a simple print handler. It outputs
+ the fields of an encoded PER message to stdout in a structured output
format..
*/
#include "asterisk.h"
static const char* pVarName;
static int gIndentSpaces;
-static const char* bitStrToString
+static const char* bitStrToString
(ASN1UINT numbits, const ASN1OCTET* data, char* buffer, size_t bufsiz);
-static const char* octStrToString
+static const char* octStrToString
(ASN1UINT numocts, const ASN1OCTET* data, char* buffer, size_t bufsiz);
void printCharStr32BitValue (ASN1UINT nchars, ASN132BITCHAR* data);
OOTRACEDBGB1 ("< encoded data >\n");
}
-static const char* bitStrToString
+static const char* bitStrToString
(ASN1UINT numbits, const ASN1OCTET* data, char* buffer, size_t bufsiz)
{
size_t i;
return buffer;
}
-static const char* octStrToString
+static const char* octStrToString
(ASN1UINT numocts, const ASN1OCTET* data, char* buffer, size_t bufsiz)
{
size_t i;
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/**
- @file printHandler.h
- This is an implementation of a simple print handler. It outputs
- the fields of an encoded PER message to stdout in a structured output
+ @file printHandler.h
+ This is an implementation of a simple print handler. It outputs
+ the fields of an encoded PER message to stdout in a structured output
format..
*/
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
/*
* Copyright (C) 1997-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
-/**
- * @file rtctype.h
+/**
+ * @file rtctype.h
*/
#ifndef _RTCTYPE_H_
#define _RTCTYPE_H_
#endif
#endif /* _RTCTYPE_H_ */
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
} while (mycthread->call != NULL && res >= 0);
-
+
ast_mutex_destroy(&mycthread->lock);
close(mycthread->thePipe[0]);
if (gH323Debug) {
ast_verb(0, "\tAdding g711 ulaw capability to H323 endpoint\n");
}
- ret= ooH323EpAddG711Capability(OO_G711ULAW64K, gtxframes, grxframes,
+ ret= ooH323EpAddG711Capability(OO_G711ULAW64K, gtxframes, grxframes,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if(ast_format_cmp(format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL)
if (gH323Debug) {
ast_verb(0, "\tAdding g711 alaw capability to H323 endpoint\n");
}
- ret= ooH323EpAddG711Capability(OO_G711ALAW64K, gtxframes, grxframes,
+ ret= ooH323EpAddG711Capability(OO_G711ALAW64K, gtxframes, grxframes,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding g729A capability to H323 endpoint\n");
}
- ret = ooH323EpAddG729Capability(OO_G729A, 2, 24,
+ ret = ooH323EpAddG729Capability(OO_G729A, 2, 24,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
if (gH323Debug) {
ast_verb(0, "\tAdding g729 capability to H323 endpoint\n");
}
- ret |= ooH323EpAddG729Capability(OO_G729, 2, 24,
+ ret |= ooH323EpAddG729Capability(OO_G729, 2, 24,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
if (gH323Debug) {
ast_verb(0, "\tAdding g729b capability to H323 endpoint\n");
}
- ret |= ooH323EpAddG729Capability(OO_G729B, 2, 24,
+ ret |= ooH323EpAddG729Capability(OO_G729B, 2, 24,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding g7231 capability to H323 endpoint\n");
}
- ret = ooH323EpAddG7231Capability(OO_G7231, 1, 1, FALSE,
+ ret = ooH323EpAddG7231Capability(OO_G7231, 1, 1, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding g726 capability to H323 endpoint\n");
}
- ret = ooH323EpAddG726Capability(OO_G726, gtxframes, grxframes, FALSE,
+ ret = ooH323EpAddG726Capability(OO_G726, gtxframes, grxframes, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding g726aal2 capability to H323 endpoint\n");
}
- ret = ooH323EpAddG726Capability(OO_G726AAL2, gtxframes, grxframes, FALSE,
+ ret = ooH323EpAddG726Capability(OO_G726AAL2, gtxframes, grxframes, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding h263 capability to H323 endpoint\n");
}
- ret = ooH323EpAddH263VideoCapability(OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
+ ret = ooH323EpAddH263VideoCapability(OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding gsm capability to H323 endpoint\n");
}
- ret = ooH323EpAddGSMCapability(OO_GSMFULLRATE, 4, FALSE, FALSE,
+ ret = ooH323EpAddGSMCapability(OO_GSMFULLRATE, 4, FALSE, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if (gH323Debug) {
ast_verb(0, "\tAdding speex capability to H323 endpoint\n");
}
- ret = ooH323EpAddSpeexCapability(OO_SPEEX, 4, 4, FALSE,
+ ret = ooH323EpAddSpeexCapability(OO_SPEEX, 4, 4, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
- ao2_ref(format, -1);
+ ao2_ref(format, -1);
}
-
+
if(dtmf & H323_DTMF_CISCO)
ret |= ooH323EpEnableDTMFCISCO(0);
if(dtmf & H323_DTMF_RFC2833)
{
int ret = 0, x, txframes;
if (gH323Debug) {
- ast_verb(0, "\tAdding capabilities to call(%s, %s)\n", call->callType,
+ ast_verb(0, "\tAdding capabilities to call(%s, %s)\n", call->callType,
call->callToken);
}
if(dtmf & H323_DTMF_CISCO || 1)
ret |= ooCallEnableDTMFH245Signal(call);
if (t38support)
- ooCapabilityAddT38Capability(call, OO_T38, OORXANDTX,
+ ooCapabilityAddT38Capability(call, OO_T38, OORXANDTX,
&ooh323c_start_receive_datachannel,
&ooh323c_start_transmit_datachannel,
&ooh323c_stop_receive_datachannel,
if(ast_format_cmp(format, ast_format_ulaw) == AST_FORMAT_CMP_EQUAL)
{
if (gH323Debug) {
- ast_verb(0, "\tAdding g711 ulaw capability to call(%s, %s)\n",
+ ast_verb(0, "\tAdding g711 ulaw capability to call(%s, %s)\n",
call->callType, call->callToken);
}
txframes = ast_format_cap_get_format_framing(cap, format);
- ret= ooCallAddG711Capability(call, OO_G711ULAW64K, txframes,
- txframes, OORXANDTX,
+ ret= ooCallAddG711Capability(call, OO_G711ULAW64K, txframes,
+ txframes, OORXANDTX,
&ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if(ast_format_cmp(format, ast_format_alaw) == AST_FORMAT_CMP_EQUAL)
call->callType, call->callToken);
}
txframes = ast_format_cap_get_format_framing(cap, format);
- ret= ooCallAddG711Capability(call, OO_G711ALAW64K, txframes,
- txframes, OORXANDTX,
+ ret= ooCallAddG711Capability(call, OO_G711ALAW64K, txframes,
+ txframes, OORXANDTX,
&ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
ret = ooCallAddG726Capability(call, OO_G726, txframes, grxframes, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
ret = ooCallAddG726Capability(call, OO_G726AAL2, txframes, grxframes, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if(ast_format_cmp(format, ast_format_g729) == AST_FORMAT_CMP_EQUAL)
{
-
+
txframes = (ast_format_cap_get_format_framing(cap, format))/10;
if (gH323Debug) {
ast_verb(0, "\tAdding g729A capability to call(%s, %s)\n",
call->callType, call->callToken);
}
- ret= ooCallAddG729Capability(call, OO_G729A, txframes, txframes,
+ ret= ooCallAddG729Capability(call, OO_G729A, txframes, txframes,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
if (g729onlyA)
continue;
ast_verb(0, "\tAdding g729 capability to call(%s, %s)\n",
call->callType, call->callToken);
}
- ret|= ooCallAddG729Capability(call, OO_G729, txframes, txframes,
+ ret|= ooCallAddG729Capability(call, OO_G729, txframes, txframes,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
if (gH323Debug) {
ast_verb(0, "\tAdding g729B capability to call(%s, %s)\n",
call->callType, call->callToken);
}
- ret|= ooCallAddG729Capability(call, OO_G729B, txframes, txframes,
+ ret|= ooCallAddG729Capability(call, OO_G729B, txframes, txframes,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
ast_verb(0, "\tAdding g7231 capability to call (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooCallAddG7231Capability(call, OO_G7231, 1, 1, FALSE,
+ ret = ooCallAddG7231Capability(call, OO_G7231, 1, 1, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
ast_verb(0, "\tAdding h263 capability to call (%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooCallAddH263VideoCapability(call, OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
+ ret = ooCallAddH263VideoCapability(call, OO_H263VIDEO, 1, 0, 0, 0, 0, 320*1024,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if(ast_format_cmp(format, ast_format_gsm) == AST_FORMAT_CMP_EQUAL)
{
if (gH323Debug) {
- ast_verb(0, "\tAdding gsm capability to call(%s, %s)\n",
+ ast_verb(0, "\tAdding gsm capability to call(%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooCallAddGSMCapability(call, OO_GSMFULLRATE, 4, FALSE, FALSE,
+ ret = ooCallAddGSMCapability(call, OO_GSMFULLRATE, 4, FALSE, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
if(ast_format_cmp(format, ast_format_speex) == AST_FORMAT_CMP_EQUAL)
{
if (gH323Debug) {
- ast_verb(0, "\tAdding Speex capability to call(%s, %s)\n",
+ ast_verb(0, "\tAdding Speex capability to call(%s, %s)\n",
call->callType, call->callToken);
}
- ret = ooCallAddSpeexCapability(call, OO_SPEEX, 4, 4, FALSE,
+ ret = ooCallAddSpeexCapability(call, OO_SPEEX, 4, 4, FALSE,
OORXANDTX, &ooh323c_start_receive_channel,
&ooh323c_start_transmit_channel,
- &ooh323c_stop_receive_channel,
+ &ooh323c_stop_receive_channel,
&ooh323c_stop_transmit_channel);
}
while(cur)
{
switch(cur->type)
- {
+ {
case T_H225AliasAddress_dialedDigits:
ooH323EpAddAliasDialedDigits(cur->value);
break;
}
return 1;
}
-
+
int ooh323c_start_receive_channel(ooCallData *call, ooLogicalChannel *pChannel)
{
struct ast_format *tmpfmt = NULL;
return NULL;
}
-
-
/*
* Copyright (C) 2004-2005 by Objective Systems, Inc.
*
- * This software is furnished under an open source license and may be
- * used and copied only in accordance with the terms of this license.
- * The text of the license may generally be found in the root
- * directory of this installation in the COPYING file. It
+ * This software is furnished under an open source license and may be
+ * used and copied only in accordance with the terms of this license.
+ * The text of the license may generally be found in the root
+ * directory of this installation in the COPYING file. It
* can also be viewed online at the following URL:
*
* http://www.obj-sys.com/open/license.html
*
- * Any redistributions of this file including modified versions must
+ * Any redistributions of this file including modified versions must
* maintain this copyright notice.
*
*****************************************************************************/
release_database(dbh);
return NULL;
}
-
+
if (!(cfg = ast_config_new())) {
/* If I can't alloc memory at this point, why bother doing anything else? */
ast_log(LOG_WARNING, "Out of memory!\n");
return (int)numrows;
}
-
+
static int store_mysql(const char *database, const char *table, const struct ast_variable *rt_fields)
{
struct mysql_conn *dbh;
return (int)numrows;
}
-
+
static struct ast_config *config_mysql(const char *database, const char *table, const char *file, struct ast_config *cfg, struct ast_flags config_flags, const char *unused, const char *who_asked)
{
struct mysql_conn *dbh;
.reload = reload,
.load_pri = AST_MODPRI_REALTIME_DRIVER,
);
-
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for AGI-related stuff
#
# Copyright (C) 1999-2006, Digium
/* Load into normal environment */
setenv(buf, val, 1);
-
+
}
/* Never reached */
return 0;
}
}
}
-
+
}
static char *run_command(char *command)
/* Load into normal environment */
setenv(buf, val, 1);
-
+
}
/* Never reached */
return 0;
}
}
}
-
+
}
static char *run_command(char *command)
my $cmdr = `ln -s $mp3 $link`;
chomp($cmdr);
print "Failed to create symlink to mp3: $cmdr\n" if $cmdr ne '';
-
+
print "EXEC MP3Player \"$link\"\n";
my $result = <STDIN>; &check_result($result);
`rm $link`;
-
+
if (!$MENUAFTERSONG) {
print "EXEC Playback \"$FESTIVALCACHE/jukebox_thankyou\"\n";
my $result = <STDIN>; &check_result($result);
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for PBX applications
#
# Copyright (C) 1999-2006, Digium, Inc.
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page adsi.conf adsi.conf
* \verbinclude adsi.conf.sample
*/
};
static const struct adsi_key_cmd opcmds[] = {
-
+
/* 1 - Branch on event -- handled specially */
{ "SHOWKEYS", 2, showkeys },
/* Display Control */
static int adsi_exec(struct ast_channel *chan, const char *data)
{
int res = 0;
-
+
if (ast_strlen_zero(data))
data = "asterisk.adsi";
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page amd.conf amd.conf
* \verbinclude amd.conf.sample
*/
if (dspsilence > 0) {
silenceDuration = dspsilence;
-
+
if (silenceDuration >= betweenWordsSilence) {
if (currentState != STATE_IN_SILENCE ) {
ast_verb(3, "AMD: Channel [%s]. Changed state to STATE_IN_SILENCE\n", ast_channel_name(chan));
res = 1;
break;
}
-
+
if (silenceDuration >= afterGreetingSilence && inGreeting == 1) {
ast_verb(3, "AMD: Channel [%s]. HUMAN: silenceDuration:%d afterGreetingSilence:%d\n",
ast_channel_name(chan), silenceDuration, afterGreetingSilence);
res = 1;
break;
}
-
+
} else {
consecutiveVoiceDuration += framelength;
voiceDuration += framelength;
inInitialSilence = 0;
inGreeting = 1;
}
-
+
}
}
ast_frfree(f);
}
-
+
if (!res) {
/* It took too long to get a frame back. Giving up. */
ast_verb(3, "AMD: Channel [%s]. Too long...\n", ast_channel_name(chan));
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
</syntax>
<description>
<para>This application asks the caller to enter a given password in order to continue dialplan execution.</para>
- <para>If the password begins with the <literal>/</literal> character,
+ <para>If the password begins with the <literal>/</literal> character,
it is interpreted as a file which contains a list of valid passwords, listed 1 password per line in the file.</para>
<para>When using a database key, the value associated with the key can be anything.</para>
<para>Users have three attempts to authenticate before the channel is hung up.</para>
} else {
prompt = "agent-pass";
}
-
+
/* Start asking for password */
for (retries = 0; retries < 3; retries++) {
if ((res = ast_app_getdata(chan, prompt, passwd, maxdigits, 0)) < 0)
</variable>
<variable name="AVAILCAUSECODE">
<para>The cause code returned when requesting the channel</para>
- </variable>
+ </variable>
</variablelist>
</description>
</application>
ast_str_append(&tmp_availstat, 0, "%s%s", ast_str_strlen(tmp_availstat) ? "&" : "", tmp);
if ((inuse <= 1) && (tempchan = ast_request(tech, ast_channel_nativeformats(chan), NULL, chan, number, &status))) {
ast_str_append(&tmp_availchan, 0, "%s%s", ast_str_strlen(tmp_availchan) ? "&" : "", ast_channel_name(tempchan));
-
+
snprintf(tmp, sizeof(tmp), "%s/%s", tech, number);
ast_str_append(&tmp_availorig, 0, "%s%s", ast_str_strlen(tmp_availorig) ? "&" : "", tmp);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Check channel availability");
-
<option name="e">
<argument name="ext" required="true" />
<para>Enable <emphasis>enforced</emphasis> mode, so the spying channel can
- only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
+ only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
list.</para>
</option>
<option name="E">
listed in <replaceable>grp</replaceable> matches one or more groups from the
<variable>SPYGROUP</variable> variable set on the channel to be spied upon.</para>
</argument>
- <note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
+ <note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
either a single group or a colon-delimited list of groups, such
as <literal>sales:support:accounting</literal>.</para></note>
</option>
selected channel name.</para>
</option>
<option name="r">
- <para>Record the session to the monitor spool directory. An optional base for the filename
+ <para>Record the session to the monitor spool directory. An optional base for the filename
may be specified. The default is <literal>chanspy</literal>.</para>
<argument name="basename" />
</option>
</option>
<option name="v">
<argument name="value" />
- <para>Adjust the initial volume in the range from <literal>-4</literal>
+ <para>Adjust the initial volume in the range from <literal>-4</literal>
to <literal>4</literal>. A negative value refers to a quieter setting.</para>
</option>
<option name="w">
name of the last channel that was spied on will be stored
in the <variable>SPY_CHANNEL</variable> variable.</para>
</option>
- </optionlist>
+ </optionlist>
</parameter>
</syntax>
<description>
- <para>This application is used to listen to the audio from an Asterisk channel. This includes the audio
+ <para>This application is used to listen to the audio from an Asterisk channel. This includes the audio
coming in and out of the channel being spied on. If the <literal>chanprefix</literal> parameter is specified,
only channels beginning with this string will be spied upon.</para>
<para>While spying, the following actions may be performed:</para>
<option name="e">
<argument name="ext" required="true" />
<para>Enable <emphasis>enforced</emphasis> mode, so the spying channel can
- only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
+ only monitor extensions whose name is in the <replaceable>ext</replaceable> : delimited
list.</para>
</option>
<option name="E">
listed in <replaceable>grp</replaceable> matches one or more groups from the
<variable>SPYGROUP</variable> variable set on the channel to be spied upon.</para>
</argument>
- <note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
+ <note><para>both <replaceable>grp</replaceable> and <variable>SPYGROUP</variable> can contain
either a single group or a colon-delimited list of groups, such
as <literal>sales:support:accounting</literal>.</para></note>
</option>
selected channel name.</para>
</option>
<option name="r">
- <para>Record the session to the monitor spool directory. An optional base for the filename
+ <para>Record the session to the monitor spool directory. An optional base for the filename
may be specified. The default is <literal>chanspy</literal>.</para>
<argument name="basename" />
</option>
</option>
<option name="v">
<argument name="value" />
- <para>Adjust the initial volume in the range from <literal>-4</literal>
+ <para>Adjust the initial volume in the range from <literal>-4</literal>
to <literal>4</literal>. A negative value refers to a quieter setting.</para>
</option>
<option name="w">
name of the last channel that was spied on will be stored
in the <variable>SPY_CHANNEL</variable> variable.</para>
</option>
- </optionlist>
+ </optionlist>
</parameter>
</syntax>
<description>
- <para>This application is used to listen to the audio from an Asterisk channel. This includes
+ <para>This application is used to listen to the audio from an Asterisk channel. This includes
the audio coming in and out of the channel being spied on. Only channels created by outgoing calls for the
- specified extension will be selected for spying. If the optional context is not supplied,
+ specified extension will be selected for spying. If the optional context is not supplied,
the current channel's context will be used.</para>
<para>While spying, the following actions may be performed:</para>
<para> - Dialing <literal>#</literal> cycles the volume level.</para>
num_mygroups = ast_app_separate_args(dup_mygroup, ':', mygroups,
ARRAY_LEN(mygroups));
- /* Before dahdi scan was part of chanspy, it would use the "GROUP" variable
+ /* Before dahdi scan was part of chanspy, it would use the "GROUP" variable
* rather than "SPYGROUP", this check is done to preserve expected behavior */
ast_autochan_channel_lock(autochan);
if (ast_test_flag(flags, OPTION_DAHDI_SCAN)) {
ast_log(LOG_WARNING, "ControlPlayback requires an argument (filename)\n");
return -1;
}
-
+
tmp = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, tmp);
* \brief Execute an ISDN RAS
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
int signalled = 0;
struct dahdi_bufferinfo savebi;
int x;
-
+
res = ioctl(ast_channel_fd(chan, 0), DAHDI_GET_BUFINFO, &savebi);
if(res) {
ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", ast_channel_name(chan));
if (WIFEXITED(status)) {
ast_verb(3, "RAS on %s terminated with status %d\n", ast_channel_name(chan), WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
- ast_verb(3, "RAS on %s terminated with signal %d\n",
+ ast_verb(3, "RAS on %s terminated with signal %d\n",
ast_channel_name(chan), WTERMSIG(status));
} else {
ast_verb(3, "RAS on %s terminated weirdly.\n", ast_channel_name(chan));
char *args;
struct dahdi_params dahdip;
- if (!data)
+ if (!data)
data = "";
args = ast_strdupa(data);
-
+
/* Answer the channel if it's not up */
if (ast_channel_state(chan) != AST_STATE_UP)
ast_answer(chan);
return res;
}
-static int unload_module(void)
+static int unload_module(void)
{
return ast_unregister_application(app);
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "DAHDI ISDN Remote Access Server");
-
-
</argument>
</option>
<option name="R">
- <para>Default: Indicate ringing to the calling party, even if the called party isn't actually ringing.
+ <para>Default: Indicate ringing to the calling party, even if the called party isn't actually ringing.
Allow interruption of the ringback if early media is received on the channel.</para>
</option>
<option name="S">
samples += ffactor;
ast_seekstream(fs, samples, SEEK_SET);
break;
-
+
default:
got = 0;
}
break;
}
}
-
+
} else if (f->frametype == AST_FRAME_VOICE) {
switch(mode) {
struct ast_frame *fr;
}
break;
}
-
+
}
ast_frfree(f);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Virtual Dictation Machine");
-
</synopsis>
<syntax>
<parameter name="vm-context">
- <para>This is the context within voicemail.conf to use for the Directory. If not
- specified and <literal>searchcontexts=no</literal> in
- <filename>voicemail.conf</filename>, then <literal>default</literal>
+ <para>This is the context within voicemail.conf to use for the Directory. If not
+ specified and <literal>searchcontexts=no</literal> in
+ <filename>voicemail.conf</filename>, then <literal>default</literal>
will be assumed.</para>
</parameter>
<parameter name="dial-context" required="false">
</option>
</optionlist>
<note><para>Only one of the <replaceable>f</replaceable>, <replaceable>l</replaceable>, or <replaceable>b</replaceable>
- options may be specified. <emphasis>If more than one is specified</emphasis>, then Directory will act as
+ options may be specified. <emphasis>If more than one is specified</emphasis>, then Directory will act as
if <replaceable>b</replaceable> was specified. The number
of characters for the user to type defaults to <literal>3</literal>.</para></note>
if (!res)
res = ast_waitfordigit(chan, 3000);
ast_stopstream(chan);
-
+
if (res == '0') { /* operator selected */
goto_exten(chan, dialcontext, "o");
pbx_builtin_setvar_helper(chan, "DIRECTORY_RESULT", "OPERATOR");
res = ast_stream_and_wait(chan, digits, AST_DIGIT_ANY);
}
if (!res) {
- res = ast_stream_and_wait(chan,
+ res = ast_stream_and_wait(chan,
which == FIRST ? "dir-first" :
which == LAST ? "dir-last" :
"dir-firstlast", AST_DIGIT_ANY);
</synopsis>
<syntax />
<description>
- <para>Echos back any media or DTMF frames read from the calling
+ <para>Echos back any media or DTMF frames read from the calling
channel back to itself. This will not echo CONTROL, MODEM, or NULL
frames. Note: If '#' detected application exits.</para>
<para>This application does not automatically answer and should be
int sample_queue;
};
-static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
- int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd,
+static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
+ int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd,
const struct ast_str *args, const struct ast_flags flags);
static void send_eivr_event(FILE *handle, const char event, const char *data,
char *inbuf, *variable;
const char *value;
int j;
- struct ast_str *newstring = ast_str_alloca(outbuflen);
+ struct ast_str *newstring = ast_str_alloca(outbuflen);
outbuf[0] = '\0';
}
break;
}
-
+
ast_channel_lock(chan);
if (!(value = pbx_builtin_getvar_helper(chan, variable))) {
value = "";
char *buf;
int j;
- char *s, **app_args, *e;
+ char *s, **app_args, *e;
struct ast_str *comma_delim_args = ast_str_alloca(100);
AST_DECLARE_APP_ARGS(eivr_args,
if (ast_test_flag(&flags, run_dead)) {
ast_verb(4, "run_dead is set\n");
}
-
+
if (!(ast_test_flag(&flags, noanswer))) {
ast_verb(3, "Answering channel and starting generator\n");
if (ast_channel_state(chan) != AST_STATE_UP) {
ast_chan_log(LOG_ERROR, chan, "Could not create pipe for child errors: %s\n", strerror(errno));
goto exit;
}
-
+
pid = ast_safe_fork(0);
if (pid < 0) {
ast_log(LOG_ERROR, "Failed to fork(): %s\n", strerror(errno));
goto exit;
}
-
+
if (!pid) {
/* child process */
if (ast_opt_high_priority)
ast_set_priority(0);
-
+
dup2(child_stdin[0], STDIN_FILENO);
dup2(child_stdout[1], STDOUT_FILENO);
dup2(child_stderr[1], STDERR_FILENO);
return res;
}
-static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
- int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd,
+static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
+ int *eivr_events_fd, int *eivr_commands_fd, int *eivr_errors_fd,
const struct ast_str *args, const struct ast_flags flags)
{
struct playlist_entry *entry;
int res = -1;
int test_available_fd = -1;
int hangup_info_sent = 0;
-
+
FILE *eivr_commands = NULL;
FILE *eivr_errors = NULL;
FILE *eivr_events = NULL;
}
test_available_fd = open("/dev/null", O_RDONLY);
-
+
setvbuf(eivr_events, NULL, _IONBF, 0);
setvbuf(eivr_commands, NULL, _IONBF, 0);
if (eivr_errors) {
break;
}
}
-
+
ready_fd = 0;
ms = 100;
errno = 0;
exception = 0;
-
+
rchan = ast_waitfor_nandfds(&chan, 1, waitfds, (eivr_errors_fd) ? 2 : 1, &exception, &ready_fd, &ms);
-
+
if (ast_channel_state(chan) == AST_STATE_UP && !AST_LIST_EMPTY(&u->finishlist)) {
AST_LIST_LOCK(&u->finishlist);
while ((entry = AST_LIST_REMOVE_HEAD(&u->finishlist, list))) {
}
AST_LIST_UNLOCK(&u->finishlist);
}
-
+
if (ast_channel_state(chan) == AST_STATE_UP && !(ast_check_hangup(chan)) && rchan) {
/* the channel has something */
f = ast_read(chan);
ast_frfree(f);
} else if (ready_fd == *eivr_commands_fd) {
char input[1024];
-
+
if (exception || (dup2(*eivr_commands_fd, test_available_fd) == -1) || feof(eivr_commands)) {
ast_chan_log(LOG_ERROR, chan, "Child process went away\n");
break;
}
-
+
if (!fgets(input, sizeof(input), eivr_commands)) {
continue;
}
}
} else if (eivr_errors_fd && (ready_fd == *eivr_errors_fd)) {
char input[1024];
-
+
if (exception || feof(eivr_errors)) {
ast_chan_log(LOG_ERROR, chan, "Child process went away\n");
break;
if (fgets(input, sizeof(input), eivr_errors)) {
ast_chan_log(LOG_NOTICE, chan, "stderr: %s\n", ast_strip(input));
}
- } else if ((ready_fd < 0) && ms) {
+ } else if ((ready_fd < 0) && ms) {
if (errno == 0 || errno == EINTR)
continue;
-
+
ast_chan_log(LOG_ERROR, chan, "Wait failed (%s)\n", strerror(errno));
break;
}
}
-
+
exit:
if (test_available_fd > -1) {
close(test_available_fd);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "External IVR Interface Application");
-
* Asterisk -- An open source telephony toolkit.
*
* Simple fax applications
- *
+ *
* 2007-2008, Dmitry Andrianov <asterisk@dima.spb.ru>
*
* Code based on original implementation by Steve Underwood <steveu@coppice.org>
<para>Filename of TIFF file save incoming fax</para>
</parameter>
<parameter name="c" required="false">
- <para>Makes the application behave as the calling machine</para>
+ <para>Makes the application behave as the calling machine</para>
<para>(Default behavior is as answering machine)</para>
</parameter>
</syntax>
<description>
- <para>Receives a FAX from the channel into the given filename
+ <para>Receives a FAX from the channel into the given filename
overwriting the file if it already exists.</para>
<para>File created will be in TIFF format.</para>
int level = SPAN_LOG_WARNING + option_debug;
span_log_set_message_handler(state, span_message);
- span_log_set_level(state, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | level);
+ span_log_set_level(state, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | level);
return 0;
}
fax_state_t *fax = (fax_state_t*) data;
uint8_t buffer[AST_FRIENDLY_OFFSET + MAX_SAMPLES * sizeof(uint16_t)];
int16_t *buf = (int16_t *) (buffer + AST_FRIENDLY_OFFSET);
-
+
struct ast_frame outf = {
.frametype = AST_FRAME_VOICE,
.subclass.format = ast_format_slin,
ast_log(LOG_WARNING, "Only generating %d samples, where %d requested\n", MAX_SAMPLES, samples);
samples = MAX_SAMPLES;
}
-
+
if ((len = fax_tx(fax, buf, samples)) > 0) {
outf.samples = len;
AST_FRAME_SET_BUFFER(&outf, buffer, AST_FRIENDLY_OFFSET, len * sizeof(int16_t));
/* Clear all channel variables which to be set by the application.
Pre-set status to error so in case of any problems we can just leave */
- pbx_builtin_setvar_helper(s->chan, "FAXSTATUS", "FAILED");
- pbx_builtin_setvar_helper(s->chan, "FAXERROR", "Channel problems");
+ pbx_builtin_setvar_helper(s->chan, "FAXSTATUS", "FAILED");
+ pbx_builtin_setvar_helper(s->chan, "FAXERROR", "Channel problems");
pbx_builtin_setvar_helper(s->chan, "FAXMODE", NULL);
pbx_builtin_setvar_helper(s->chan, "REMOTESTATIONID", NULL);
pbx_builtin_setvar_helper(s->chan, "FAXPAGES", "0");
pbx_builtin_setvar_helper(s->chan, "FAXRESOLUTION", NULL);
- pbx_builtin_setvar_helper(s->chan, "FAXBITRATE", NULL);
+ pbx_builtin_setvar_helper(s->chan, "FAXBITRATE", NULL);
if (ast_channel_state(s->chan) != AST_STATE_UP) {
/* Shouldn't need this, but checking to see if channel is already answered
s->t38state = ast_channel_get_t38_state(s->chan);
if (s->t38state != T38_STATE_NEGOTIATED) {
- /* T38 is not negotiated on the channel yet. First start regular transmission. If it switches to T38, follow */
- pbx_builtin_setvar_helper(s->chan, "FAXMODE", "audio");
+ /* T38 is not negotiated on the channel yet. First start regular transmission. If it switches to T38, follow */
+ pbx_builtin_setvar_helper(s->chan, "FAXMODE", "audio");
res = transmit_audio(s);
if (res > 0) {
/* transmit_audio reports switchover to T38. Update t38state */
}
if (s->t38state == T38_STATE_NEGOTIATED) {
- pbx_builtin_setvar_helper(s->chan, "FAXMODE", "T38");
+ pbx_builtin_setvar_helper(s->chan, "FAXMODE", "T38");
res = transmit_t38(s);
}
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
-
+
session.caller_mode = TRUE;
if (args.options) {
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
-
+
session.caller_mode = FALSE;
if (args.options) {
{
int res;
- res = ast_unregister_application(app_sndfax_name);
- res |= ast_unregister_application(app_rcvfax_name);
+ res = ast_unregister_application(app_sndfax_name);
+ res |= ast_unregister_application(app_rcvfax_name);
return res;
}
.load = load_module,
.unload = unload_module,
);
-
-
* \author Christos Ricudis <ricudis@itc.auth.gr>
*
* \extref The Festival Speech Synthesis System - http://www.cstr.ed.ac.uk/projects/festival/
- *
+ *
* \ingroup applications
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page festival.conf festival.conf
* \verbinclude festival.conf.sample
*/
ast_answer(chan);
ast_stopstream(chan);
ast_indicate(chan, -1);
-
+
owriteformat = ao2_bump(ast_channel_writeformat(chan));
res = ast_set_write_format(chan, ast_format_slin);
if (res < 0) {
myf.f.offset = AST_FRIENDLY_OFFSET;
myf.f.src = __PRETTY_FUNCTION__;
myf.f.data.ptr = myf.frdata;
-
+
res = send_waveform_to_fd(waveform, length, fds[1]);
if (res >= 0) {
/* Order is important -- there's almost always going to be mp3... we want to prioritize the
int strln;
int fdesc = -1;
char buffer[16384];
- int seekpos = 0;
- char *data;
+ int seekpos = 0;
+ char *data;
struct ast_config *cfg;
char *newfestivalcommand;
struct ast_flags config_flags = { 0 };
newfestivalcommand[j] = '\0';
festivalcommand = newfestivalcommand;
}
-
+
if (args.interrupt && !strcasecmp(args.interrupt, "any"))
args.interrupt = AST_DIGIT_ANY;
ast_debug(1, "Text passed to festival server : %s\n", args.text);
/* Connect to local festival server */
-
+
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd < 0) {
MD5Final(MD5Res, &md5ctx);
MD5Hex[0] = '\0';
- /* Convert to HEX and look if there is any matching file in the cache
+ /* Convert to HEX and look if there is any matching file in the cache
directory */
for (i = 0; i < 16; i++) {
snprintf(koko, sizeof(koko), "%X", (unsigned)MD5Res[i]);
ast_log(LOG_WARNING, "read() failed: %s\n", strerror(errno));
}
bigstring[strln] = 0;
- if (strcmp(bigstring, args.text) == 0) {
+ if (strcmp(bigstring, args.text) == 0) {
readcache = 1;
} else {
ast_log(LOG_WARNING, "Strings do not match\n");
fflush(fs);
fclose(fs);
}
-
+
/* Write to cache and then pass it down */
if (writecache == 1) {
ast_debug(1, "Writing result to cache...\n");
fd = open(cachefile, O_RDWR);
lseek(fd, seekpos, SEEK_SET);
}
-
+
ast_debug(1, "Passing data to channel...\n");
/* Read back info from server */
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Simple Festival Interface");
-
* \brief App to flash a DAHDI trunk
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
-
+
/*** MODULEINFO
<depend>dahdi</depend>
<support_level>core</support_level>
ast_log(LOG_WARNING, "%s is not a DAHDI channel\n", ast_channel_name(chan));
return -1;
}
-
+
memset(&dahdip, 0, sizeof(dahdip));
res = ioctl(ast_channel_fd(chan, 0), DAHDI_GET_PARAMS, &dahdip);
if (!res) {
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Flash channel application");
-
* Asterisk -- An open source telephony toolkit.
*
* A full-featured Find-Me/Follow-Me Application
- *
+ *
* Copyright (C) 2005-2006, BJ Weschke All Rights Reserved.
*
* BJ Weschke <bweschke@btwtech.com>
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page followme.conf followme.conf
* \verbinclude followme.conf.sample
*/
}
}
-
-
+
+
/*! \brief Set parameter in profile from configuration file */
static void profile_set_param(struct call_followme *f, const char *param, const char *val, int linenum, int failunknown)
{
- if (!strcasecmp(param, "musicclass") || !strcasecmp(param, "musiconhold") || !strcasecmp(param, "music"))
+ if (!strcasecmp(param, "musicclass") || !strcasecmp(param, "musiconhold") || !strcasecmp(param, "music"))
ast_copy_string(f->moh, val, sizeof(f->moh));
- else if (!strcasecmp(param, "context"))
+ else if (!strcasecmp(param, "context"))
ast_copy_string(f->context, val, sizeof(f->context));
else if (!strcasecmp(param, "takecall"))
ast_copy_string(f->takecall, val, sizeof(f->takecall));
ast_copy_string(f->nextindp, val, sizeof(f->nextindp));
else if (!strcasecmp(param, "call-from-prompt") || !strcasecmp(param, "call_from_prompt"))
ast_copy_string(f->callfromprompt, val, sizeof(f->callfromprompt));
- else if (!strcasecmp(param, "followme-norecording-prompt") || !strcasecmp(param, "norecording_prompt"))
+ else if (!strcasecmp(param, "followme-norecording-prompt") || !strcasecmp(param, "norecording_prompt"))
ast_copy_string(f->norecordingprompt, val, sizeof(f->norecordingprompt));
- else if (!strcasecmp(param, "followme-options-prompt") || !strcasecmp(param, "options_prompt"))
+ else if (!strcasecmp(param, "followme-options-prompt") || !strcasecmp(param, "options_prompt"))
ast_copy_string(f->optionsprompt, val, sizeof(f->optionsprompt));
else if (!strcasecmp(param, "followme-pls-hold-prompt") || !strcasecmp(param, "pls_hold_prompt"))
ast_copy_string(f->plsholdprompt, val, sizeof(f->plsholdprompt));
- else if (!strcasecmp(param, "followme-status-prompt") || !strcasecmp(param, "status_prompt"))
+ else if (!strcasecmp(param, "followme-status-prompt") || !strcasecmp(param, "status_prompt"))
ast_copy_string(f->statusprompt, val, sizeof(f->statusprompt));
- else if (!strcasecmp(param, "followme-sorry-prompt") || !strcasecmp(param, "sorry_prompt"))
+ else if (!strcasecmp(param, "followme-sorry-prompt") || !strcasecmp(param, "sorry_prompt"))
ast_copy_string(f->sorryprompt, val, sizeof(f->sorryprompt));
else if (failunknown) {
if (linenum >= 0)
numorder = atoi(tmp);
if (numorder < 0)
numorder = 0;
- } else
+ } else
numorder = 0;
} else {
timeout = 25;
if (!numorder) {
idx = 1;
- AST_LIST_TRAVERSE(&f->numbers, nm, entry)
+ AST_LIST_TRAVERSE(&f->numbers, nm, entry)
idx++;
numorder = idx;
}
var = var->next;
} /* End while(var) loop */
- if (!new)
+ if (!new)
ast_mutex_unlock(&f->lock);
else
AST_RWLIST_INSERT_HEAD(&followmes, f, entry);
tmpuser->ochan = NULL;
}
-static void clear_unanswered_calls(struct findme_user_listptr *findme_user_list)
+static void clear_unanswered_calls(struct findme_user_listptr *findme_user_list)
{
struct findme_user *tmpuser;
char *callfromname;
char *pressbuttonname;
- /* ------------ wait_for_winner_channel start --------------- */
+ /* ------------ wait_for_winner_channel start --------------- */
callfromname = ast_strdupa(tpargs->callfromprompt);
pressbuttonname = ast_strdupa(tpargs->optionsprompt);
for (;;) {
to = 1000;
- pos = 1;
+ pos = 1;
livechannels = 0;
watchers[0] = caller;
ast_channel_publish_dial(caller, winner, NULL, "ANSWER");
publish_dial_end_event(caller, findme_user_list, winner, "CANCEL");
tmpuser->answered = 1;
- /* If call has been answered, then the eventual hangup is likely to be normal hangup */
+ /* If call has been answered, then the eventual hangup is likely to be normal hangup */
ast_channel_hangupcause_set(winner, AST_CAUSE_NORMAL_CLEARING);
ast_channel_hangupcause_set(caller, AST_CAUSE_NORMAL_CLEARING);
ast_verb(3, "Starting playback of %s\n", callfromname);
f->subclass.integer, ast_channel_name(winner));
break;
}
- }
+ }
if (tmpuser && tmpuser->state == 3 && f->frametype == AST_FRAME_DTMF) {
int cmp_len;
ast_copy_string(targs->plsholdprompt, f->plsholdprompt, sizeof(targs->plsholdprompt));
ast_copy_string(targs->statusprompt, f->statusprompt, sizeof(targs->statusprompt));
ast_copy_string(targs->sorryprompt, f->sorryprompt, sizeof(targs->sorryprompt));
- /* Copy the numbers we're going to use into another list in case the master list should get modified
+ /* Copy the numbers we're going to use into another list in case the master list should get modified
(and locked) while we're trying to do a follow-me */
AST_LIST_HEAD_INIT_NOLOCK(&targs->cnumbers);
AST_LIST_TRAVERSE(&f->numbers, nm, entry) {
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* \author Anthony Minessale anthmct@yahoo.com
*
* \note Development of this app Sponsored/Funded by TAAN Softworks Corp
- *
+ *
* \ingroup applications
*/
* \brief Get ADSI CPE ID
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
cpeid[0], cpeid[1], cpeid[2], cpeid[3]);
else
strcpy(data[1], "CPEID Unknown");
- if (gotgeometry)
+ if (gotgeometry)
snprintf(data[2], 80, "Geom: %dx%d, %d buttons", width, height, buttons);
else
strcpy(data[2], "Geometry unknown");
* \brief Stream to an icecast server via ICES (see contrib/asterisk-ices.xml)
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* ICES - http://www.icecast.org/ices.php
*
* \ingroup applications
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
int res;
res = ast_safe_fork(0);
- if (res < 0)
+ if (res < 0)
ast_log(LOG_WARNING, "Fork failed\n");
if (res) {
return res;
dup2(fd, STDIN_FILENO);
ast_close_fds_above_n(STDERR_FILENO);
- /* Most commonly installed in /usr/local/bin
- * But many places has it in /usr/bin
+ /* Most commonly installed in /usr/local/bin
+ * But many places has it in /usr/bin
* As a last-ditch effort, try to use PATH
*/
execl(path_LOCAL "ices2", "ices", filename, SENTINEL);
ast_log(LOG_WARNING, "ICES requires an argument (configfile.xml)\n");
return -1;
}
-
+
if (pipe(fds)) {
ast_log(LOG_WARNING, "Unable to create pipe\n");
return -1;
}
flags = fcntl(fds[1], F_GETFL);
fcntl(fds[1], F_SETFL, flags | O_NONBLOCK);
-
+
ast_stopstream(chan);
if (ast_channel_state(chan) != AST_STATE_UP)
res = ast_answer(chan);
-
+
if (res) {
close(fds[0]);
close(fds[1]);
ast_copy_string(filename, (char *) data, sizeof(filename));
else
snprintf(filename, sizeof(filename), "%s/%s", ast_config_AST_CONFIG_DIR, (char *)data);
- /* Placeholder for options */
+ /* Placeholder for options */
c = strchr(filename, '|');
if (c)
- *c = '\0';
+ *c = '\0';
res = icesencode(filename, fds[0]);
if (res >= 0) {
pid = res;
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Encode and Stream via icecast and ices");
-
* \brief App to transmit an image
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
} else {
pbx_builtin_setvar_helper(chan, "SENDIMAGESTATUS", "FAILURE");
}
-
+
return 0;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Image Transmission Application");
-
* \brief IVR Demo application
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
return 0;
}
-AST_IVR_DECLARE_MENU(ivr_submenu, "IVR Demo Sub Menu", 0,
+AST_IVR_DECLARE_MENU(ivr_submenu, "IVR Demo Sub Menu", 0,
{
{ "s", AST_ACTION_BACKGROUND, "demo-abouttotry" },
{ "s", AST_ACTION_WAITOPTION },
{ NULL }
});
-AST_IVR_DECLARE_MENU(ivr_demo, "IVR Demo Main Menu", 0,
+AST_IVR_DECLARE_MENU(ivr_demo, "IVR Demo Main Menu", 0,
{
{ "s", AST_ACTION_BACKGROUND, "demo-congrats" },
{ "g", AST_ACTION_BACKGROUND, "demo-instruct" },
{
int res=0;
char *tmp;
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "skel requires an argument (filename)\n");
return -1;
}
-
+
tmp = ast_strdupa(data);
/* Do our thing here */
res = ast_answer(chan);
if (!res)
res = ast_ivr_menu_run(chan, &ivr_demo, tmp);
-
+
return res;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "IVR Demo Application");
-
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "JACK Interface");
-
* \brief Dial plan macro Implementation
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
if ((s = pbx_builtin_getvar_helper(chan, "MACRO_RECURSION"))) {
sscanf(s, "%30d", &maxdepth);
}
-
+
/* Count how many levels deep the rabbit hole goes */
if ((s = pbx_builtin_getvar_helper(chan, "MACRO_DEPTH"))) {
sscanf(s, "%30d", &depth);
}
-
+
/* Used for detecting whether to return when a Macro is called from another Macro after hangup */
if (strcmp(ast_channel_exten(chan), "h") == 0)
pbx_builtin_setvar_helper(chan, "MACRO_IN_HANGUP", "1");
-
+
if ((inhangupc = pbx_builtin_getvar_helper(chan, "MACRO_IN_HANGUP"))) {
sscanf(inhangupc, "%30d", &inhangup);
}
save_macro_priority = ast_strdup(pbx_builtin_getvar_helper(chan, "MACRO_PRIORITY"));
snprintf(pc, sizeof(pc), "%d", oldpriority);
pbx_builtin_setvar_helper(chan, "MACRO_PRIORITY", pc);
-
+
save_macro_offset = ast_strdup(pbx_builtin_getvar_helper(chan, "MACRO_OFFSET"));
pbx_builtin_setvar_helper(chan, "MACRO_OFFSET", NULL);
return _macro_exec(chan, data, 1);
}
-static int macroif_exec(struct ast_channel *chan, const char *data)
+static int macroif_exec(struct ast_channel *chan, const char *data)
{
char *expr = NULL, *label_a = NULL, *label_b = NULL;
int res = 0;
}
if (pbx_checkcondition(expr))
res = macro_exec(chan, label_a);
- else if (label_b)
+ else if (label_b)
res = macro_exec(chan, label_b);
} else
ast_log(LOG_WARNING, "Invalid Syntax.\n");
return res;
}
-
+
static int macro_exit_exec(struct ast_channel *chan, const char *data)
{
return MACRO_EXIT_RESULT;
*
* \author Mark Spencer <markster@digium.com>
* \author (SLA) Russell Bryant <russell@digium.com>
- *
+ *
* \ingroup applications
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page meetme.conf meetme.conf
* \verbinclude meetme.conf.sample
*/
CONFFLAG_TALKER = (1 << 4),
/*! If set there will be no enter or leave sounds */
CONFFLAG_QUIET = (1 << 5),
- /*! If set, when user joins the conference, they will be told the number
+ /*! If set, when user joins the conference, they will be told the number
* of users that are already in */
CONFFLAG_ANNOUNCEUSERCOUNT = (1 << 6),
/*! Set to run AGI Script in Background */
CONFFLAG_ALWAYSPROMPT = (1 << 20),
/*! If set, treat talking users as muted users */
CONFFLAG_OPTIMIZETALKER = (1 << 21),
- /*! If set, won't speak the extra prompt when the first person
+ /*! If set, won't speak the extra prompt when the first person
* enters the conference */
CONFFLAG_NOONLYPERSON = (1 << 22),
- /*! If set, user will be asked to record name on entry of conference
+ /*! If set, user will be asked to record name on entry of conference
* without review */
CONFFLAG_INTROUSERNOREVIEW = (1 << 23),
/*! If set, the user will be initially self-muted */
CONFFLAG_DURATION_LIMIT = (1 << 30),
};
-/* These flags are defined separately because we ran out of bits that an enum can be used to represent.
+/* These flags are defined separately because we ran out of bits that an enum can be used to represent.
If you add new flags, be sure to do it in the same way that these are. */
/*! Do not write any audio to this channel until the state is up. */
#define CONFFLAG_NO_AUDIO_UNTIL_UP (1ULL << 31)
struct sla_station {
AST_RWLIST_ENTRY(sla_station) entry;
AST_DECLARE_STRING_FIELDS(
- AST_STRING_FIELD(name);
- AST_STRING_FIELD(device);
- AST_STRING_FIELD(autocontext);
+ AST_STRING_FIELD(name);
+ AST_STRING_FIELD(device);
+ AST_STRING_FIELD(autocontext);
);
AST_LIST_HEAD_NOLOCK(, sla_trunk_ref) trunks;
struct ast_dial *dial;
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(name);
AST_STRING_FIELD(device);
- AST_STRING_FIELD(autocontext);
+ AST_STRING_FIELD(autocontext);
);
AST_LIST_HEAD_NOLOCK(, sla_station_ref) stations;
/*! Number of stations that use this trunk */
AST_LIST_ENTRY(sla_event) entry;
};
-/*! \brief A station that failed to be dialed
+/*! \brief A station that failed to be dialed
* \note Only used by the SLA thread. */
struct sla_failed_station {
struct sla_station *station;
* when in a conference */
static int audio_buffers;
-/*! \brief Map 'volume' levels from -5 through +5 into decibel (dB)
+/*! \brief Map 'volume' levels from -5 through +5 into decibel (dB)
* settings for channel drivers.
*
* \note these are not a straight linear-to-dB
return "(talking)";
else if (x < 0)
return "(unmonitored)";
- else
+ else
return "(not talking)";
}
{
switch (action) {
case VOL_UP:
- switch (vol->desired) {
+ switch (vol->desired) {
case 5:
break;
case 0:
AST_LIST_UNLOCK(&confs);
- if (!res)
+ if (!res)
ast_autoservice_stop(chan);
}
AST_LIST_LOCK(&confs);
AST_LIST_TRAVERSE(&confs, cnf, list) {
- if (!strcmp(confno, cnf->confno))
+ if (!strcmp(confno, cnf->confno))
break;
}
/* Reserve conference number in map */
if ((sscanf(cnf->confno, "%30d", &confno_int) == 1) && (confno_int >= 0 && confno_int < 1024))
conf_map[confno_int] = 1;
-
+
cnfout:
ao2_cleanup(cap_slin);
if (cnf)
ast_test_flag64(&user->userflags, CONFFLAG_MONITOR) ? "(Listen only)" : "",
user->adminflags & ADMINFLAG_MUTED ? "(Admin Muted)" : user->adminflags & ADMINFLAG_SELFMUTED ? "(Muted)" : "",
user->adminflags & ADMINFLAG_T_REQUEST ? "(Request to Talk)" : "",
- istalking(user->talking), hr, min, sec);
+ istalking(user->talking), hr, min, sec);
} else {
ast_cli(a->fd, "%d!%s!%s!%s!%s!%s!%s!%s!%d!%02d:%02d:%02d\n",
user->user_no,
/* Unlock */
ast_str_append(&cmdline, 0, ",l");
}
- } else if (strcasestr(a->argv[1], "mute")) {
+ } else if (strcasestr(a->argv[1], "mute")) {
if (strcasecmp(a->argv[1], "mute") == 0) {
/* Mute */
if (strcasecmp(a->argv[3], "all") == 0) {
ast_str_append(&cmdline, 0, ",N");
} else {
- ast_str_append(&cmdline, 0, ",M,%s", a->argv[3]);
+ ast_str_append(&cmdline, 0, ",M,%s", a->argv[3]);
}
} else {
/* Unmute */
"=== ==> BargeAllowed: %s\n"
"=== ==> HoldAccess: %s\n"
"=== ==> Stations ...\n",
- trunk->name, trunk->device,
- S_OR(trunk->autocontext, "(none)"),
+ trunk->name, trunk->device,
+ S_OR(trunk->autocontext, "(none)"),
ring_timeout,
trunk->barge_disabled ? "No" : "Yes",
sla_hold_str(trunk->hold_access));
return NULL;
}
- ast_cli(a->fd, "\n"
+ ast_cli(a->fd, "\n"
"=============================================================\n"
"=== Configured SLA Stations =================================\n"
"=============================================================\n"
ao2_lock(station);
if (station->ring_timeout) {
- snprintf(ring_timeout, sizeof(ring_timeout),
+ snprintf(ring_timeout, sizeof(ring_timeout),
"%u", station->ring_timeout);
}
if (station->ring_delay) {
- snprintf(ring_delay, sizeof(ring_delay),
+ snprintf(ring_delay, sizeof(ring_delay),
"%u", station->ring_delay);
}
ast_cli(a->fd, "=== ---------------------------------------------------------\n"
"=== ==> HoldAccess: %s\n"
"=== ==> Trunks ...\n",
station->name, station->device,
- S_OR(station->autocontext, "(none)"),
+ S_OR(station->autocontext, "(none)"),
ring_timeout, ring_delay,
sla_hold_str(station->hold_access));
AST_LIST_TRAVERSE(&station->trunks, trunk_ref, entry) {
ast_cond_signal(&conf->announcelist_addition);
ast_mutex_unlock(&conf->announcelistlock);
pthread_join(conf->announcethread, NULL);
-
+
while ((item = AST_LIST_REMOVE_HEAD(&conf->announcelist, entry))) {
/* If it's a voicemail greeting file we don't want to remove it */
if (!item->vmrec){
ao2_iterator_destroy(&user_iter);
}
-static void sla_queue_event_full(enum sla_event_type type,
+static void sla_queue_event_full(enum sla_event_type type,
struct sla_trunk_ref *trunk_ref, struct sla_station *station, int lock)
{
struct sla_event *event;
else
exitkeys = ast_strdupa("#"); /* Default */
}
-
+
if (ast_test_flag64(confflags, CONFFLAG_RECORDCONF)) {
if (!conf->recordingfilename) {
const char *var;
ast_mutex_unlock(&conf->announcethreadlock);
time(&user->jointime);
-
+
user->timelimit = timelimit;
user->play_warning = play_warning;
user->warning_freq = warning_freq;
user->warning_sound = warning_sound;
- user->end_sound = end_sound;
-
+ user->end_sound = end_sound;
+
if (calldurationlimit > 0) {
time(&user->kicktime);
user->kicktime = user->kicktime + calldurationlimit;
}
-
+
if (ast_tvzero(user->start_time))
user->start_time = ast_tvnow();
time_left_ms = user->timelimit;
-
+
if (user->timelimit) {
nexteventts = ast_tvadd(user->start_time, ast_samp2tv(user->timelimit, 1000));
nexteventts = ast_tvsub(nexteventts, ast_samp2tv(user->play_warning, 1000));
}
if (conf->locked && (!ast_test_flag64(confflags, CONFFLAG_ADMIN))) {
- /* Sorry, but this conference is locked! */
+ /* Sorry, but this conference is locked! */
if (!ast_streamfile(chan, "conf-locked", ast_channel_language(chan)))
ast_waitstream(chan, "");
goto outrun;
if (rt_schedule && conf->maxusers) {
if (conf->users >= conf->maxusers) {
- /* Sorry, but this confernce has reached the participant limit! */
+ /* Sorry, but this confernce has reached the participant limit! */
ast_mutex_unlock(&conf->playlock);
if (!ast_streamfile(chan, "conf-full", ast_channel_language(chan)))
ast_waitstream(chan, "");
if (ast_test_flag64(confflags, CONFFLAG_ANNOUNCEUSERCOUNT) && conf->users > 1) {
int keepplaying = 1;
- if (conf->users == 2) {
+ if (conf->users == 2) {
if (!ast_streamfile(chan, "conf-onlyone", ast_channel_language(chan))) {
res = ast_waitstream(chan, AST_DIGIT_ANY);
ast_stopstream(chan);
else if (res == -1)
goto outrun;
}
- } else {
+ } else {
if (!ast_streamfile(chan, "conf-thereare", ast_channel_language(chan))) {
res = ast_waitstream(chan, AST_DIGIT_ANY);
ast_stopstream(chan);
ast_stopstream(chan);
if (res > 0)
keepplaying = 0;
- else if (res == -1)
+ else if (res == -1)
goto outrun;
}
}
agifile = ast_strdupa(agifiledefault);
}
ast_channel_unlock(chan);
-
+
if (user->dahdichannel) {
/* Set CONFMUTE mode on DAHDI channel to mute DTMF tones */
x = 1;
}
break;
}
-
+
to = -1;
if (user->timelimit) {
int minutes = 0, seconds = 0, remain = 0;
-
+
to = ast_tvdiff_ms(nexteventts, now);
if (to < 0) {
to = 0;
if (time_left_ms < to) {
to = time_left_ms;
}
-
+
if (time_left_ms <= 0) {
- if (user->end_sound) {
+ if (user->end_sound) {
res = ast_streamfile(chan, user->end_sound, ast_channel_language(chan));
res = ast_waitstream(chan, "");
}
}
break;
}
-
+
if (!to) {
- if (time_left_ms >= 5000) {
-
+ if (time_left_ms >= 5000) {
+
remain = (time_left_ms + 500) / 1000;
if (remain / 60 >= 1) {
minutes = remain / 60;
} else {
seconds = remain;
}
-
+
/* force the time left to round up if appropriate */
if (user->warning_sound && user->play_warning) {
if (!strcmp(user->warning_sound, "timeleft")) {
-
+
res = ast_streamfile(chan, "vm-youhave", ast_channel_language(chan));
res = ast_waitstream(chan, "");
if (minutes) {
ast_moh_stop(chan);
musiconhold = 0;
}
- if (!ast_test_flag64(confflags, CONFFLAG_QUIET) &&
+ if (!ast_test_flag64(confflags, CONFFLAG_QUIET) &&
!ast_test_flag64(confflags, CONFFLAG_MARKEDUSER)) {
if (!ast_streamfile(chan, "conf-placeintoconf", ast_channel_language(chan))) {
ast_waitstream(chan, "");
if (!musiconhold) {
conf_start_moh(chan, optargs[OPT_ARG_MOH_CLASS]);
musiconhold = 1;
- }
+ }
} else {
if (musiconhold) {
ast_moh_stop(chan);
}
}
}
-
+
/* Leave if the last marked user left */
if (currentmarked == 0 && lastmarked != 0 && ast_test_flag64(confflags, CONFFLAG_MARKEDEXIT)) {
if (ast_test_flag64(confflags, CONFFLAG_KICK_CONTINUE)) {
meetme_stasis_generate_msg(conf, chan, user, meetme_mute_type(), status_blob);
}
- if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
+ if ((user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
(user->adminflags & ADMINFLAG_T_REQUEST) && !(talkreq_manager)) {
RAII_VAR(struct ast_json *, status_blob, status_to_json(1), ast_json_unref);
meetme_stasis_generate_msg(conf, chan, user, meetme_talk_request_type(), status_blob);
}
- if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
+ if (!(user->adminflags & (ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED)) &&
!(user->adminflags & ADMINFLAG_T_REQUEST) && (talkreq_manager)) {
RAII_VAR(struct ast_json *, status_blob, status_to_json(0), ast_json_unref);
talkreq_manager = 0;
/* If I have been kicked, exit the conference */
if (user->adminflags & ADMINFLAG_KICKME) {
/* You have been kicked. */
- if (!ast_test_flag64(confflags, CONFFLAG_QUIET) &&
+ if (!ast_test_flag64(confflags, CONFFLAG_QUIET) &&
!ast_streamfile(chan, "conf-kicked", ast_channel_language(chan))) {
ast_waitstream(chan, "");
}
if (musiconhold) {
ast_moh_stop(chan);
}
-
+
if (using_pseudo) {
close(fd);
} else {
/* Take out of conference */
- dahdic.chan = 0;
+ dahdic.chan = 0;
dahdic.confno = 0;
dahdic.confmode = 0;
if (ioctl(fd, DAHDI_SETCONF, &dahdic)) {
if (dsp) {
ast_dsp_free(dsp);
}
-
+
if (user->user_no) {
/* Only cleanup users who really joined! */
now = ast_tvnow();
}
}
/* Remove ourselves from the container */
- ao2_unlink(conf->usercontainer, user);
+ ao2_unlink(conf->usercontainer, user);
/* Change any states */
if (!conf->users) {
ast_log(LOG_WARNING, "No DAHDI channel available for conference, user introduction disabled (is chan_dahdi loaded?)\n");
ast_clear_flag64(confflags, CONFFLAG_INTROUSER | CONFFLAG_INTROUSERNOREVIEW | CONFFLAG_INTROUSER_VMREC);
}
-
+
if (confflags && !cnf->chan &&
ast_test_flag64(confflags, CONFFLAG_RECORDCONF)) {
ast_log(LOG_WARNING, "No DAHDI channel available for conference, conference recording disabled (is chan_dahdi loaded?)\n");
struct ast_conference *conf;
int count;
char *localdata;
- char val[80] = "0";
+ char val[80] = "0";
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(confno);
AST_APP_ARG(varname);
ast_log(LOG_WARNING, "MeetMeCount requires an argument (conference number)\n");
return -1;
}
-
+
localdata = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, localdata);
-
+
conf = find_conf(chan, args.confno, 0, 0, NULL, 0, 1, NULL);
if (conf) {
} else {
notdata = data;
}
-
+
if (ast_channel_state(chan) != AST_STATE_UP)
ast_answer(chan);
info = ast_strdupa(notdata);
- AST_STANDARD_APP_ARGS(args, info);
+ AST_STANDARD_APP_ARGS(args, info);
if (args.confno) {
ast_copy_string(confno, args.confno, sizeof(confno));
allowretry = 1;
}
}
-
+
if (args.pin)
ast_copy_string(the_pin, args.pin, sizeof(the_pin));
}
if (!ast_strlen_zero(confno)) {
/* Check the validity of the conference */
- cnf = find_conf(chan, confno, 1, dynamic, the_pin,
+ cnf = find_conf(chan, confno, 1, dynamic, the_pin,
sizeof(the_pin), 1, &confflags);
if (!cnf) {
int too_early = 0;
- cnf = find_conf_realtime(chan, confno, 1, dynamic,
+ cnf = find_conf_realtime(chan, confno, 1, dynamic,
the_pin, sizeof(the_pin), 1, &confflags, &too_early, optargs);
if (rt_schedule && too_early)
allowretry = 0;
/* No pin required */
allowretry = 0;
- /* For RealTime conferences without a pin
+ /* For RealTime conferences without a pin
* should still support loading options
*/
if (!ast_strlen_zero(cnf->useropts)) {
if (cnf)
dispose_conf(cnf);
-
+
return res;
}
return 0;
}
-/*! \brief The MeetMeadmin application
+/*! \brief The MeetMeadmin application
MeetMeAdmin(confno, command, caller) */
static int admin_exec(struct ast_channel *chan, const char *data) {
}
switch (*args.command) {
- case 76: /* L: Lock */
+ case 76: /* L: Lock */
cnf->locked = 1;
break;
- case 108: /* l: Unlock */
+ case 108: /* l: Unlock */
cnf->locked = 0;
break;
case 75: /* K: kick all users */
}
break;
}
- case 77: /* M: Mute */
+ case 77: /* M: Mute */
user->adminflags |= ADMINFLAG_MUTED;
break;
case 78: /* N: Mute all (non-admin) users */
ao2_callback(cnf->usercontainer, OBJ_NODATA, user_set_muted_cb, &cnf);
- break;
- case 109: /* m: Unmute */
+ break;
+ case 109: /* m: Unmute */
user->adminflags &= ~(ADMINFLAG_MUTED | ADMINFLAG_SELFMUTED | ADMINFLAG_T_REQUEST);
break;
case 110: /* n: Unmute all users */
ao2_callback(cnf->usercontainer, OBJ_NODATA, user_set_unmuted_cb, NULL);
break;
- case 107: /* k: Kick user */
+ case 107: /* k: Kick user */
user->adminflags |= ADMINFLAG_KICKME;
break;
case 118: /* v: Lower all users listen volume */
return 0;
}
-/*! \brief The MeetMeChannelAdmin application
+/*! \brief The MeetMeChannelAdmin application
MeetMeChannelAdmin(channel, command) */
static int channel_admin_exec(struct ast_channel *chan, const char *data) {
char *params;
ast_log(LOG_WARNING, "MeetMeChannelAdmin requires two arguments!\n");
return -1;
}
-
+
params = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, params);
break;
}
}
-
+
if (!user) {
ast_log(LOG_NOTICE, "Specified user (%s) not found\n", args.channel);
AST_LIST_UNLOCK(&confs);
return 0;
}
-
+
/* perform the specified action */
switch (*args.command) {
- case 77: /* M: Mute */
+ case 77: /* M: Mute */
user->adminflags |= ADMINFLAG_MUTED;
break;
- case 109: /* m: Unmute */
+ case 109: /* m: Unmute */
user->adminflags &= ~ADMINFLAG_MUTED;
break;
- case 107: /* k: Kick user */
+ case 107: /* k: Kick user */
user->adminflags |= ADMINFLAG_KICKME;
break;
default: /* unknown command */
}
ao2_ref(user, -1);
AST_LIST_UNLOCK(&confs);
-
+
return 0;
}
markedusers,
hr, min, sec,
cnf->isdynamic ? "Dynamic" : "Static",
- cnf->locked ? "Yes" : "No");
+ cnf->locked ? "Yes" : "No");
}
AST_LIST_UNLOCK(&confs);
s = ast_writefile(filename_buffer, cnf->recordingformat, NULL, flags, 0, AST_FILE_MODE);
oldrecordingfilename = filename_buffer;
}
-
+
f = ast_read(cnf->lchan);
if (!f) {
res = -1;
cnf->recording = MEETME_RECORD_OFF;
if (s)
ast_closestream(s);
-
+
pthread_exit(0);
}
if ((sscanf(val, "%30d", &fuzzystart) != 1)) {
ast_log(LOG_WARNING, "fuzzystart must be a number, not '%s'\n", val);
fuzzystart = 0;
- }
+ }
}
if ((val = ast_variable_retrieve(cfg, "general", "earlyalert"))) {
if ((sscanf(val, "%30d", &earlyalert) != 1)) {
ast_log(LOG_WARNING, "earlyalert must be a number, not '%s'\n", val);
earlyalert = 0;
- }
+ }
}
if ((val = ast_variable_retrieve(cfg, "general", "endalert"))) {
if ((sscanf(val, "%30d", &endalert) != 1)) {
ast_log(LOG_WARNING, "endalert must be a number, not '%s'\n", val);
endalert = 0;
- }
+ }
}
if ((val = ast_variable_retrieve(cfg, "general", "extendby"))) {
if ((sscanf(val, "%30d", &extendby) != 1)) {
ast_log(LOG_WARNING, "extendby must be a number, not '%s'\n", val);
extendby = 0;
- }
+ }
}
ast_config_destroy(cfg);
if (strcasecmp(trunk_ref->trunk->name, name))
continue;
- if ( (trunk_ref->trunk->barge_disabled
+ if ( (trunk_ref->trunk->barge_disabled
&& trunk_ref->state == SLA_TRUNK_STATE_UP) ||
- (trunk_ref->trunk->hold_stations
+ (trunk_ref->trunk->hold_stations
&& trunk_ref->trunk->hold_access == SLA_HOLD_PRIVATE
&& trunk_ref->state != SLA_TRUNK_STATE_ONHOLD_BYME) ||
- sla_check_station_hold_access(trunk_ref->trunk, station) )
+ sla_check_station_hold_access(trunk_ref->trunk, station) )
{
trunk_ref = NULL;
}
return AST_DEVICE_UNKNOWN;
}
-static void sla_change_trunk_state(const struct sla_trunk *trunk, enum sla_trunk_state state,
+static void sla_change_trunk_state(const struct sla_trunk *trunk, enum sla_trunk_state state,
enum sla_which_trunk_refs inactive_only, const struct sla_trunk_ref *exclude)
{
struct sla_station *station;
ast_atomic_fetchadd_int((int *) &trunk_ref->trunk->active_stations, 1);
ast_str_set(&conf_name, 0, "SLA_%s", trunk_ref->trunk->name);
- ast_set_flag64(&conf_flags,
+ ast_set_flag64(&conf_flags,
CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_PASS_DTMF | CONFFLAG_SLA_STATION);
answer_trunk_chan(trunk_ref->chan);
conf = build_conf(ast_str_buffer(conf_name), "", "", 0, 0, 1, trunk_ref->chan, NULL);
* \return a pointer to the selected ringing trunk, or NULL if none found
* \note Assumes that sla.lock is locked
*/
-static struct sla_ringing_trunk *sla_choose_ringing_trunk(struct sla_station *station,
+static struct sla_ringing_trunk *sla_choose_ringing_trunk(struct sla_station *station,
struct sla_trunk_ref **trunk_ref, int rm)
{
struct sla_trunk_ref *s_trunk_ref;
break;
}
AST_LIST_TRAVERSE_SAFE_END;
-
+
if (ringing_trunk)
break;
}
AST_LIST_TRAVERSE_SAFE_END;
}
-/*! \brief Check to see if this station is already ringing
- * \note Assumes sla.lock is locked
+/*! \brief Check to see if this station is already ringing
+ * \note Assumes sla.lock is locked
*/
static int sla_check_ringing_station(const struct sla_station *station)
{
}
res = ast_dial_run(dial, ringing_trunk->trunk->chan, 1);
-
+
/* Restore saved caller ID */
if (caller_is_saved) {
ast_party_caller_free(ast_channel_caller(ringing_trunk->trunk->chan));
ast_channel_caller_set(ringing_trunk->trunk->chan, &caller);
}
-
+
if (res != AST_DIAL_RESULT_TRYING) {
struct sla_failed_station *failed_station;
ast_dial_destroy(dial);
* \param ringing_trunk the trunk. If NULL, the highest priority ringing trunk will be used
* \return the number of ms left before the delay is complete, or INT_MAX if there is no delay
*/
-static int sla_check_station_delay(struct sla_station *station,
+static int sla_check_station_delay(struct sla_station *station,
struct sla_ringing_trunk *ringing_trunk)
{
RAII_VAR(struct sla_trunk_ref *, trunk_ref, NULL, ao2_cleanup);
event->trunk_ref->state = SLA_TRUNK_STATE_ONHOLD_BYME;
ast_devstate_changed(AST_DEVICE_ONHOLD, AST_DEVSTATE_CACHABLE, "SLA:%s_%s",
event->station->name, event->trunk_ref->trunk->name);
- sla_change_trunk_state(event->trunk_ref->trunk, SLA_TRUNK_STATE_ONHOLD,
+ sla_change_trunk_state(event->trunk_ref->trunk, SLA_TRUNK_STATE_ONHOLD,
INACTIVE_TRUNK_REFS, event->trunk_ref);
if (event->trunk_ref->trunk->active_stations == 1) {
continue;
/* If there is no time left, then the station needs to start ringing.
- * Return non-zero so that an event will be queued up an event to
+ * Return non-zero so that an event will be queued up an event to
* make that happen. */
if (time_left <= 0) {
res = 1;
}
snprintf(conf_name, sizeof(conf_name), "SLA_%s", trunk_ref->trunk->name);
- ast_set_flag64(&conf_flags,
- CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER |
+ ast_set_flag64(&conf_flags,
+ CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER |
CONFFLAG_PASS_DTMF | CONFFLAG_SLA_TRUNK);
conf = build_conf(conf_name, "", "", 1, 1, 1, trunk_ref->trunk->chan, NULL);
trunk_ref->trunk->hold_stations = 0;
sla_change_trunk_state(trunk_ref->trunk, SLA_TRUNK_STATE_IDLE, ALL_TRUNK_REFS, NULL);
}
-
+
pbx_builtin_setvar_helper(chan, "SLASTATION_STATUS", "SUCCESS");
return 0;
pbx_builtin_setvar_helper(chan, "SLATRUNK_STATUS", "FAILURE");
return 0;
}
- ast_set_flag64(&conf_flags,
+ ast_set_flag64(&conf_flags,
CONFFLAG_QUIET | CONFFLAG_MARKEDEXIT | CONFFLAG_MARKEDUSER | CONFFLAG_PASS_DTMF | CONFFLAG_NO_AUDIO_UNTIL_UP);
if (ast_test_flag(&opt_flags, SLA_TRUNK_OPT_MOH)) {
char hint[AST_MAX_APP];
snprintf(exten, sizeof(exten), "%s_%s", station->name, trunk_ref->trunk->name);
snprintf(hint, sizeof(hint), "SLA:%s", exten);
- ast_context_remove_extension(station->autocontext, exten,
+ ast_context_remove_extension(station->autocontext, exten,
1, sla_registrar);
- ast_context_remove_extension(station->autocontext, hint,
+ ast_context_remove_extension(station->autocontext, hint,
PRIORITY_HINT, sla_registrar);
}
}
char hint[AST_MAX_APP];
snprintf(exten, sizeof(exten), "%s_%s", station->name, trunk_ref->trunk->name);
snprintf(hint, sizeof(hint), "SLA:%s", exten);
- /* Extension for this line button
+ /* Extension for this line button
* exten => station1_line1,1,SLAStation(station1_line1) */
if (ast_add_extension(station->autocontext, 0 /* don't replace */, exten, 1,
NULL, NULL, slastation_app, ast_strdup(exten), ast_free_ptr, sla_registrar)) {
"for trunk '%s'!\n", station->name);
return -1;
}
- /* Hint for this line button
+ /* Hint for this line button
* exten => station1_line1,hint,SLA:station1_line1 */
if (ast_add_extension(station->autocontext, 0 /* don't replace */, exten, PRIORITY_HINT,
NULL, NULL, hint, NULL, NULL, sla_registrar)) {
ast_log(LOG_NOTICE, "Error: invalid keyword: '%s'\n", args.keyword);
snprintf(buf, len, "0");
} else if (result == -2) {
- ast_log(LOG_NOTICE, "Error: conference (%s) not found\n", args.confno);
+ ast_log(LOG_NOTICE, "Error: conference (%s) not found\n", args.confno);
snprintf(buf, len, "0");
}
continue;
}
- ao2_callback(cnf->usercontainer, OBJ_NODATA, user_add_provider_cb, data_meetme_users);
+ ao2_callback(cnf->usercontainer, OBJ_NODATA, user_add_provider_cb, data_meetme_users);
}
if (!ast_data_search_match(search, data_meetme)) {
static int unload_module(void)
{
int res = 0;
-
+
ast_cli_unregister_multiple(cli_meetme, ARRAY_LEN(cli_meetme));
res = ast_manager_unregister("MeetmeMute");
res |= ast_manager_unregister("MeetmeUnmute");
ast_devstate_prov_del("Meetme");
ast_devstate_prov_del("SLA");
-
+
sla_destroy();
-
+
res |= ast_custom_function_unregister(&meetme_info_acf);
ast_unload_realtime("meetme");
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
.reload = reload,
.load_pri = AST_MODPRI_DEVSTATE_PROVIDER,
);
-
* \brief Digital Milliwatt Test
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
*
* A voicemail system in small building blocks, working together
* based on the Comedian Mail voicemail system (app_voicemail.c).
- *
+ *
* \par See also
* \arg \ref Config_minivm_examples
* \arg \ref App_minivm
* \ingroup applications
*
* \page App_minivm Asterisk Mini-voicemail - A minimal voicemail system
- *
+ *
* This is a minimal voicemail system, building blocks for something
* else. It is built for multi-language systems.
- * The current version is focused on accounts where voicemail is
+ * The current version is focused on accounts where voicemail is
* forwarded to users in e-mail. It's work in progress, with loosed ends hanging
* around from the old voicemail system and it's configuration.
*
* - General configuration in minivm.conf
* - Users in realtime or configuration file
* - Or configured on the command line with just the e-mail address
- *
+ *
* Voicemail accounts are identified by userid and domain
*
* Language codes are like setlocale - langcode_countrycode
* \note Don't use language codes like the rest of Asterisk, two letter countrycode. Use
- * language_country like setlocale().
- *
+ * language_country like setlocale().
+ *
* Examples:
* - Swedish, Sweden sv_se
* - Swedish, Finland sv_fi
* - English, USA en_us
* - English, GB en_gb
- *
+ *
* \par See also
* \arg \ref Config_minivm
* \arg \ref Config_minivm_examples
} else if (!strcasecmp(var->name, "charset")) {
ast_copy_string(template->charset, var->value, sizeof(template->charset));
} else if (!strcasecmp(var->name, "templatefile")) {
- if (template->body)
+ if (template->body)
ast_free(template->body);
template->body = message_template_parse_filebody(var->value);
if (!template->body) {
error++;
}
} else if (!strcasecmp(var->name, "messagebody")) {
- if (template->body)
+ if (template->body)
ast_free(template->body);
template->body = message_template_parse_emailbody(var->value);
if (!template->body) {
{
char callerid[256];
struct ast_variable *var;
-
+
if (!channel) {
ast_log(LOG_ERROR, "No allocated channel, giving up...\n");
return;
* \brief Set default values for Mini-Voicemail users */
static void populate_defaults(struct minivm_account *vmu)
{
- ast_copy_flags(vmu, (&globalflags), AST_FLAGS_ALL);
+ ast_copy_flags(vmu, (&globalflags), AST_FLAGS_ALL);
ast_copy_string(vmu->attachfmt, default_vmformat, sizeof(vmu->attachfmt));
vmu->volgain = global_volgain;
}
{
struct minivm_account *this;
AST_LIST_LOCK(&minivm_accounts);
- while ((this = AST_LIST_REMOVE_HEAD(&minivm_accounts, list)))
+ while ((this = AST_LIST_REMOVE_HEAD(&minivm_accounts, list)))
ast_free(this);
AST_LIST_UNLOCK(&minivm_accounts);
}
if (createtemp && !vmu) {
/* Create a temporary user, send e-mail and be gone */
vmu = mvm_user_alloc();
- ast_set2_flag(vmu, TRUE, MVM_ALLOCED);
+ ast_set2_flag(vmu, TRUE, MVM_ALLOCED);
if (vmu) {
ast_copy_string(vmu->username, username, sizeof(vmu->username));
ast_copy_string(vmu->domain, domain, sizeof(vmu->domain));
if (!retval)
return NULL;
- if (username)
+ if (username)
ast_copy_string(retval->username, username, sizeof(retval->username));
populate_defaults(retval);
if (type == MVM_MESSAGE_EMAIL) {
if (vmu && !ast_strlen_zero(vmu->email)) {
- ast_copy_string(email, vmu->email, sizeof(email));
+ ast_copy_string(email, vmu->email, sizeof(email));
} else if (!ast_strlen_zero(vmu->username) && !ast_strlen_zero(vmu->domain))
snprintf(email, sizeof(email), "%s@%s", vmu->username, vmu->domain);
} else if (type == MVM_MESSAGE_PAGE) {
struct minivm_zone *z;
AST_LIST_LOCK(&minivm_zones);
AST_LIST_TRAVERSE(&minivm_zones, z, list) {
- if (strcmp(z->name, vmu->zonetag))
+ if (strcmp(z->name, vmu->zonetag))
continue;
the_zone = z;
}
} else {
fprintf(p, "From: %s <%s>\n", ast_str_quote(&str2, 0, ast_str_buffer(str1)), who);
}
- }
+ }
fprintf(p, "Message-ID: <Asterisk-%u-%s-%d-%s>\n", (unsigned int)ast_random(), vmu->username, (int)getpid(), who);
} else {
fprintf(p, "Dear %s:\n\n\tJust wanted to let you know you were just left a %s long message \n"
"in mailbox %s from %s, on %s so you might\n"
- "want to check it when you get a chance. Thanks!\n\n\t\t\t\t--Asterisk\n\n", vmu->fullname,
+ "want to check it when you get a chance. Thanks!\n\n\t\t\t\t--Asterisk\n\n", vmu->fullname,
dur, vmu->username, (cidname ? cidname : (cidnum ? cidnum : "an unknown caller")), date);
ast_debug(3, "Using default message body (no template)\n-----\n");
}
* \param dest String. base directory.
* \param len Int. Length base directory string.
* \param domain String. Ignored if is null or empty string.
- * \param username String. Ignored if is null or empty string.
+ * \param username String. Ignored if is null or empty string.
* \param folder String. Ignored if is null or empty string.
* \return 0 on failure, 1 on success.
*/
if (ast_fileexists(fn, NULL, NULL) > 0) {
res = ast_streamfile(chan, fn, ast_channel_language(chan));
- if (res)
+ if (res)
return -1;
res = ast_waitstream(chan, ecodes);
- if (res)
+ if (res)
return res;
} else {
int numericusername = 1;
case '3':
message_exists = 0;
/* Record */
- if (recorded == 1)
+ if (recorded == 1)
ast_verb(3, "Re-recording the message\n");
else
ast_verb(3, "Recording the message\n");
- if (recorded && outsidecaller)
+ if (recorded && outsidecaller)
cmd = ast_play_and_wait(chan, "beep");
recorded = 1;
/* After an attempt has been made to record message, we have to take care of INTRO and beep for incoming messages, but not for greetings */
return res;
}
-
+
/*!\internal
* \brief Record voicemail message, store into file prepared for sending e-mail */
static int leave_voicemail(struct ast_channel *chan, char *username, struct leave_vm_options *options)
"%s:%s:%s:%s:%d:%s:%s:%s:%s:%d:%s:%s\n",
username,
ast_channel_context(chan),
- ast_channel_macrocontext(chan),
+ ast_channel_macrocontext(chan),
ast_channel_exten(chan),
ast_channel_priority(chan),
ast_channel_name(chan),
callerid,
- date,
+ date,
timebuf,
duration,
duration < global_vmminmessage ? "IGNORED" : "OK",
vmu->accountcode
- );
+ );
fprintf(txt, "%s", logbuf);
if (minivmlogfile) {
ast_mutex_lock(&minivmloglock);
unlink(tmptxtfile);
pbx_builtin_setvar_helper(chan, "MVM_RECORD_STATUS", "FAILED");
return 0;
- }
+ }
fclose(txt); /* Close log file */
if (ast_fileexists(tmptxtfile, NULL, NULL) <= 0) {
ast_debug(1, "The recorded media file is gone, so we should remove the .txt file too!\n");
if (domain) {
*domain = '\0';
domain++;
- }
+ }
if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument 0 %s\n", argv[0]);
return -1;
ast_channel_unlock(chan);
/* Notify of new message to e-mail and pager */
if (!ast_strlen_zero(filename)) {
- ast_channel_lock(chan);
+ ast_channel_lock(chan);
if ((format = pbx_builtin_getvar_helper(chan, "MVM_FORMAT"))) {
format = ast_strdupa(format);
}
if (sscanf(opts[OPT_ARG_RECORDGAIN], "%30d", &gain) != 1) {
ast_log(LOG_WARNING, "Invalid value '%s' provided for record gain option\n", opts[OPT_ARG_RECORDGAIN]);
return -1;
- } else
+ } else
leave_options.record_gain = (signed char) gain;
}
- }
+ }
/* Now run the appliation and good luck to you! */
res = leave_voicemail(chan, argv[0], &leave_options);
if (domain) {
*domain = '\0';
domain++;
- }
+ }
if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument: %s\n", argv[0]);
return -1;
res = 0; /* Reset */
/* Play the beginning intro if desired */
if (!ast_strlen_zero(prefile)) {
- if (ast_streamfile(chan, prefile, ast_channel_language(chan)) > -1)
+ if (ast_streamfile(chan, prefile, ast_channel_language(chan)) > -1)
res = ast_waitstream(chan, ecodes);
} else {
ast_debug(2, "%s doesn't exist, doing what we can\n", prefile);
if (ast_strlen_zero(filename)) {
ast_log(LOG_ERROR, "No filename given in application arguments or channel variable MVM_FILENAME\n");
return res;
- }
+ }
/* Go ahead and delete audio files from system, they're not needed any more */
/* We should look for both audio and text files here */
if (domain) {
*domain = '\0';
domain++;
- }
+ }
if (ast_strlen_zero(domain) || ast_strlen_zero(username)) {
ast_log(LOG_ERROR, "Need username@domain as argument. Sorry. Argument 0 %s\n", argv[0]);
pbx_builtin_setvar_helper(chan, "MVM_ACCMESS_STATUS", "FAILED");
/* Answer channel if it's not already answered */
if (ast_channel_state(chan) != AST_STATE_UP)
ast_answer(chan);
-
+
/* Here's where the action is */
if (ast_test_flag(&flags, OPT_BUSY_GREETING)) {
message = "busy";
vmu = ast_calloc(1, sizeof(*vmu));
if (!vmu)
return 0;
-
+
ast_copy_string(vmu->domain, domain, sizeof(vmu->domain));
ast_copy_string(vmu->username, username, sizeof(vmu->username));
var = var->next;
}
ast_debug(3, "...Linking account %s\n", name);
-
+
AST_LIST_LOCK(&minivm_accounts);
AST_LIST_INSERT_TAIL(&minivm_accounts, vmu, list);
AST_LIST_UNLOCK(&minivm_accounts);
struct minivm_zone *this;
AST_LIST_LOCK(&minivm_zones);
- while ((this = AST_LIST_REMOVE_HEAD(&minivm_zones, list)))
+ while ((this = AST_LIST_REMOVE_HEAD(&minivm_zones, list)))
free_zone(this);
-
+
AST_LIST_UNLOCK(&minivm_zones);
}
ast_free(newzone);
return 0;
}
-
+
ast_copy_string(newzone->name, zonename, sizeof(newzone->name));
ast_copy_string(newzone->timezone, timezone_str, sizeof(newzone->timezone));
ast_copy_string(newzone->msg_format, msg_format, sizeof(newzone->msg_format));
if (ast_strlen_zero(filename))
return NULL;
- if (*filename == '/')
+ if (*filename == '/')
ast_copy_string(filenamebuf, filename, sizeof(filenamebuf));
- else
+ else
snprintf(filenamebuf, sizeof(filenamebuf), "%s/%s", ast_config_AST_CONFIG_DIR, filename);
if (!(fi = fopen(filenamebuf, "r"))) {
}
tmpread = tmpwrite + len;
}
- return emailbody;
+ return emailbody;
}
/*! \brief Apply general configuration options */
} else if (!strcmp(var->name, "format")) {
ast_copy_string(default_vmformat, var->value, sizeof(default_vmformat));
} else if (!strcmp(var->name, "review")) {
- ast_set2_flag((&globalflags), ast_true(var->value), MVM_REVIEW);
+ ast_set2_flag((&globalflags), ast_true(var->value), MVM_REVIEW);
} else if (!strcmp(var->name, "operator")) {
- ast_set2_flag((&globalflags), ast_true(var->value), MVM_OPERATOR);
+ ast_set2_flag((&globalflags), ast_true(var->value), MVM_OPERATOR);
}
var = var->next;
}
global_maxsilence = 0;
global_saydurationminfo = 2;
ast_copy_string(default_vmformat, "wav", sizeof(default_vmformat));
- ast_set2_flag((&globalflags), FALSE, MVM_REVIEW);
- ast_set2_flag((&globalflags), FALSE, MVM_OPERATOR);
+ ast_set2_flag((&globalflags), FALSE, MVM_REVIEW);
+ ast_set2_flag((&globalflags), FALSE, MVM_OPERATOR);
/* Reset statistics */
memset(&global_stats, 0, sizeof(global_stats));
global_stats.reset = ast_tvnow();
template = message_template_find("email-default");
/* Load date format config for voicemail mail */
- if ((chanvar = ast_variable_retrieve(cfg, "general", "emaildateformat")))
+ if ((chanvar = ast_variable_retrieve(cfg, "general", "emaildateformat")))
ast_copy_string(template->dateformat, chanvar, sizeof(template->dateformat));
if ((chanvar = ast_variable_retrieve(cfg, "general", "emailfromstring")))
ast_copy_string(template->fromaddress, chanvar, sizeof(template->fromaddress));
ast_copy_string(template->serveremail, chanvar, sizeof(template->serveremail));
if ((chanvar = ast_variable_retrieve(cfg, "general", "emailcharset")))
ast_copy_string(template->charset, chanvar, sizeof(template->charset));
- if ((chanvar = ast_variable_retrieve(cfg, "general", "emailsubject")))
+ if ((chanvar = ast_variable_retrieve(cfg, "general", "emailsubject")))
ast_copy_string(template->subject, chanvar, sizeof(template->subject));
- if ((chanvar = ast_variable_retrieve(cfg, "general", "emailbody")))
+ if ((chanvar = ast_variable_retrieve(cfg, "general", "emailbody")))
template->body = message_template_parse_emailbody(chanvar);
template->attachment = TRUE;
ast_copy_string(template->charset, chanvar, sizeof(template->charset));
if ((chanvar = ast_variable_retrieve(cfg, "general", "pagersubject")))
ast_copy_string(template->subject, chanvar,sizeof(template->subject));
- if ((chanvar = ast_variable_retrieve(cfg, "general", "pagerbody")))
+ if ((chanvar = ast_variable_retrieve(cfg, "general", "pagerbody")))
template->body = message_template_parse_emailbody(chanvar);
template->attachment = FALSE;
ast_cli(a->fd, HVLT_OUTPUT_FORMAT, "Template name", "Charset", "Locale", "Attach media", "Subject");
ast_cli(a->fd, HVLT_OUTPUT_FORMAT, "-------------", "-------", "------", "------------", "-------");
AST_LIST_TRAVERSE(&message_templates, this, list) {
- ast_cli(a->fd, HVLT_OUTPUT_FORMAT, this->name,
+ ast_cli(a->fd, HVLT_OUTPUT_FORMAT, this->name,
S_OR(this->charset, "-"),
S_OR(this->locale, "-"),
this->attachment ? "Yes" : "No",
char buf[BUFSIZ];
switch (cmd) {
-
+
case CLI_INIT:
e->command = "minivm show stats";
e->usage =
if (!strcasecmp(colname, "hasaccount")) {
ast_copy_string(buf, (ast_test_flag(vmu, MVM_ALLOCED) ? "0" : "1"), len);
- } else if (!strcasecmp(colname, "fullname")) {
+ } else if (!strcasecmp(colname, "fullname")) {
ast_copy_string(buf, vmu->fullname, len);
- } else if (!strcasecmp(colname, "email")) {
+ } else if (!strcasecmp(colname, "email")) {
if (!ast_strlen_zero(vmu->email))
ast_copy_string(buf, vmu->email, len);
else
snprintf(buf, len, "%s@%s", vmu->username, vmu->domain);
- } else if (!strcasecmp(colname, "pager")) {
+ } else if (!strcasecmp(colname, "pager")) {
ast_copy_string(buf, vmu->pager, len);
- } else if (!strcasecmp(colname, "etemplate")) {
+ } else if (!strcasecmp(colname, "etemplate")) {
if (!ast_strlen_zero(vmu->etemplate))
ast_copy_string(buf, vmu->etemplate, len);
else
ast_copy_string(buf, "email-default", len);
- } else if (!strcasecmp(colname, "language")) {
+ } else if (!strcasecmp(colname, "language")) {
ast_copy_string(buf, vmu->language, len);
- } else if (!strcasecmp(colname, "timezone")) {
+ } else if (!strcasecmp(colname, "timezone")) {
ast_copy_string(buf, vmu->zonetag, len);
- } else if (!strcasecmp(colname, "ptemplate")) {
+ } else if (!strcasecmp(colname, "ptemplate")) {
if (!ast_strlen_zero(vmu->ptemplate))
ast_copy_string(buf, vmu->ptemplate, len);
else
}
}
-/*! \brief Access counter file, lock directory, read and possibly write it again changed
+/*! \brief Access counter file, lock directory, read and possibly write it again changed
\param directory Directory to crate file in
- \param countername filename
+ \param countername filename
\param value If set to zero, we only read the variable
- \param operand 0 to read, 1 to set new value, 2 to change
+ \param operand 0 to read, 1 to set new value, 2 to change
\return -1 on error, otherwise counter value
*/
static int access_counter_file(char *directory, char *countername, int value, int operand)
counter = 0;
break;
}
-
+
/* Now, write the new value to the file */
counterfile = fopen(filename, "w");
if (!counterfile) {
if ((countername = strchr(username, ':'))) {
*countername = '\0';
countername++;
- }
+ }
if ((domain = strchr(username, '@'))) {
*domain = '\0';
if ((countername = strchr(username, ':'))) {
*countername = '\0';
countername++;
- }
+ }
if ((operand = strchr(countername, ':'))) {
*operand = '\0';
operand++;
- }
+ }
if ((domain = strchr(username, '@'))) {
*domain = '\0';
static struct ast_cli_entry cli_minivm[] = {
AST_CLI_DEFINE(handle_minivm_show_users, "List defined mini-voicemail boxes"),
AST_CLI_DEFINE(handle_minivm_show_zones, "List zone message formats"),
- AST_CLI_DEFINE(handle_minivm_list_templates, "List message templates"),
+ AST_CLI_DEFINE(handle_minivm_list_templates, "List message templates"),
AST_CLI_DEFINE(handle_minivm_reload, "Reload Mini-voicemail configuration"),
AST_CLI_DEFINE(handle_minivm_show_stats, "Show some mini-voicemail statistics"),
AST_CLI_DEFINE(handle_minivm_show_settings, "Show mini-voicemail general settings"),
/*! \brief Reload cofiguration */
static char *handle_minivm_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
-
+
switch (cmd) {
case CLI_INIT:
e->command = "minivm reload";
case CLI_GENERATE:
return NULL;
}
-
+
reload();
ast_cli(a->fd, "\n-- Mini voicemail re-configured \n");
return CLI_SUCCESS;
static int unload_module(void)
{
int res;
-
+
res = ast_unregister_application(app_minivm_record);
res |= ast_unregister_application(app_minivm_greet);
res |= ast_unregister_application(app_minivm_notify);
<ref type="application">SayPhonetic</ref>
</see-also>
</application>
- ***/
+ ***/
static const char app_morsecode[] = "Morsecode";
static const char * const morsecode[] = {
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Morse code");
-
*
* \note Add feature to play local M3U playlist file
* Vincent Li <mchun.li@gmail.com>
- *
+ *
* \ingroup applications
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
char sampling_rate_str[8];
res = ast_safe_fork(0);
- if (res < 0)
+ if (res < 0)
ast_log(LOG_WARNING, "Fork failed\n");
if (res) {
return res;
return -1;
}
return read(fd, data, datalen);
-
+
}
static int mp3_exec(struct ast_channel *chan, const char *data)
ast_log(LOG_WARNING, "Unable to create pipe\n");
return -1;
}
-
+
ast_stopstream(chan);
native_format = ast_format_cap_get_format(ast_channel_nativeformats(chan), 0);
myf.f.delivery.tv_sec = 0;
myf.f.delivery.tv_usec = 0;
myf.f.data.ptr = myf.frdata;
-
+
res = mp3play(data, sampling_rate, fds[1]);
if (!strncasecmp(data, "http://", 7)) {
timeout = 10000;
break;
}
ast_frfree(f);
- }
+ }
}
}
}
close(fds[0]);
close(fds[1]);
-
+
if (pid > -1)
kill(pid, SIGKILL);
if (!res && owriteformat)
ast_set_write_format(chan, owriteformat);
ast_frfree(&myf.f);
-
+
return res;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Silly MP3 Application");
-
* \brief Silly application to play an NBScat file -- uses nbscat8k
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
return -1;
}
return read(fd, data, datalen);
-
+
}
static int NBScat_exec(struct ast_channel *chan, const char *data)
ast_log(LOG_WARNING, "Unable to create socketpair\n");
return -1;
}
-
+
ast_stopstream(chan);
owriteformat = ao2_bump(ast_channel_writeformat(chan));
myf.f.delivery.tv_sec = 0;
myf.f.delivery.tv_usec = 0;
myf.f.data.ptr = myf.frdata;
-
+
res = NBScatplay(fds[1]);
/* Wait 1000 ms first */
next = ast_tvnow();
break;
}
ast_frfree(f);
- }
+ }
}
}
}
close(fds[0]);
close(fds[1]);
ast_frfree(&myf.f);
-
+
if (pid > -1)
kill(pid, SIGKILL);
if (!res && owriteformat)
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Silly NBS Stream Application");
-
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Page Multiple Phones");
-
* \brief Trivial application to playback a sound file
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
ast_waitstream_full(a->chan, a->ints, a->audiofd, a->ctrlfd) :
ast_waitstream(a->chan, a->ints);
ast_stopstream(a->chan);
- return res;
+ return res;
}
/*! \brief
{
struct ast_variable *v;
char *lang, *x, *rule = NULL;
- int ret = 0;
+ int ret = 0;
struct varshead head = { .first = NULL, .last = NULL };
struct ast_var_t *n;
strcpy(fn2 + l, data);
ret = do_say(a, fn2, options, depth);
}
-
+
if (ret) {
break;
}
ast_say_enumeration_full = say_enumeration_full;
#if 0
- /*! \todo XXX
+ /*! \todo XXX
These functions doesn't exist.
- say.conf.sample indicates this is working...
+ say.conf.sample indicates this is working...
*/
ast_say_digits_full = say_digits_full;
ast_say_digit_str_full = say_digit_str_full;
ast_log(LOG_WARNING, "unrecognized mode %s\n", mode);
return -1;
}
-
+
return 0;
}
switch (cmd) {
case CLI_INIT:
e->command = "say load [new|old]";
- e->usage =
+ e->usage =
"Usage: say load [new|old]\n"
" say load\n"
" Report status of current say mode\n"
AST_APP_ARG(filenames);
AST_APP_ARG(options);
);
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Playback requires an argument (filename)\n");
return -1;
option_say = 1;
if (strcasestr(args.options, "noanswer"))
option_noanswer = 1;
- }
+ }
if (ast_channel_state(chan) != AST_STATE_UP) {
if (option_skip) {
/* At the user's option, skip if the line is not up */
}
}
}
-
+
/*! \todo
* XXX here we should sort rules according to the same order
* we have in pbx.c so we have the same matching behaviour.
if (say_cfg)
ast_config_destroy(say_cfg);
- return res;
+ return res;
}
static int load_module(void)
.load_pri = AST_MODPRI_DEVSTATE_CONSUMER,
.nonoptreq = "res_monitor",
);
-
* \brief Trivial application to read a variable
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
AST_APP_ARG(attempts);
AST_APP_ARG(timeout);
);
-
+
pbx_builtin_setvar_helper(chan, "READSTATUS", status);
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "Read requires an argument (variable)\n");
return 0;
}
-
+
argcopy = ast_strdupa(data);
AST_STANDARD_APP_ARGS(arglist, argcopy);
if (!ast_strlen_zero(arglist.options)) {
ast_app_parse_options(read_app_options, &flags, NULL, arglist.options);
}
-
+
if (!ast_strlen_zero(arglist.attempts)) {
tries = atoi(arglist.attempts);
if (tries <= 0)
* \brief Trivial application to read an extension into a variable
*
* \author David Chappell <David.Chappell@trincoll.edu>
- *
+ *
* \ingroup applications
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
struct ast_filestream *s = NULL;
struct ast_frame *f = NULL;
-
+
struct ast_dsp *sildet = NULL; /* silence detector dsp */
int totalsilence = 0;
int dspsilence = 0;
return -1;
}
ast_dsp_set_threshold(sildet, ast_dsp_get_threshold_from_settings(THRESHOLD_SILENCE));
- }
+ }
if (create_destination_directory(tmp)) {
ast_log(LOG_WARNING, "Could not create directory for file %s\n", args.filename);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Decline words according to channel language");
-
* \brief SayUnixTime application
*
* \author Tilghman Lesher <app_sayunixtime__200309@the-tilghman.com>
- *
+ *
* \ingroup applications
*/
</parameter>
</syntax>
<description>
- <para>Uses some of the sound files stored in <directory>/var/lib/asterisk/sounds</directory> to construct a phrase
+ <para>Uses some of the sound files stored in <directory>/var/lib/asterisk/sounds</directory> to construct a phrase
saying the specified date and/or time in the specified format. </para>
</description>
<see-also>
static int unload_module(void)
{
int res;
-
+
res = ast_unregister_application(app_sayunixtime);
res |= ast_unregister_application(app_datetime);
-
+
return res;
}
static int load_module(void)
{
int res;
-
+
res = ast_register_application_xml(app_sayunixtime, sayunixtime_exec);
res |= ast_register_application_xml(app_datetime, sayunixtime_exec);
-
+
return res;
}
chan = ast_channel_unref(chan);
return 0;
}
-
+
if (!ast_strlen_zero(duration) && (sscanf(duration, "%30u", &duration_ms) != 1)) {
astman_send_error(s, m, "Could not convert Duration parameter");
chan = ast_channel_unref(chan);
* \brief App to transmit a text message
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \note Requires support of sending text messages from channel driver
*
* \ingroup applications
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
* \brief App to set callerid presentation
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
(char *) data);
return 0;
}
-
+
/* Set the combined caller id presentation. */
ast_channel_caller(chan)->id.name.presentation = pres;
ast_channel_caller(chan)->id.number.presentation = pres;
}
AST_MODULE_INFO_STANDARD_DEPRECATED(ASTERISK_GPL_KEY, "Set CallerID Presentation Application");
-
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page app_skel.conf app_skel.conf
* \verbinclude app_skel.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
/*! \file
*
* \brief SMS application - ETSI ES 201 912 protocol 1 implementation
- *
+ *
* \par Development notes
* \note The ETSI standards are available free of charge from ETSI at
* http://pda.etsi.org/pda/queryform.asp
* ES 201 912 SMS for PSTN/ISDN
* TS 123 040 Technical realization of SMS
*
- *
+ *
* \ingroup applications
*
* \author Adrian Kennard (for the original protocol 1 code)
for (v = 0; v < 128 && escapes[v] != u; v++);
if (v < 128) { /* escaped sequence, esc + v */
/* store the low (8-b) bits in o[p], the remaining bits in o[p+1] */
- o[p] |= (27 << b); /* the low bits go into o[p] */
+ o[p] |= (27 << b); /* the low bits go into o[p] */
b += 7;
if (b >= 8) {
b -= 8;
return p;
}
-/*! \brief takes a binary header (udhl bytes at udh) and UCS-2
- message (udl characters at ud) and packs in to o using 16 bit
- UCS-2 character codes
- The return value is the number of bytes packed in to o, which is
- internally limited to 140
- o can be null, in which case this is used to validate or count
- only if the input contains invalid characters then
+/*! \brief takes a binary header (udhl bytes at udh) and UCS-2
+ message (udl characters at ud) and packs in to o using 16 bit
+ UCS-2 character codes
+ The return value is the number of bytes packed in to o, which is
+ internally limited to 140
+ o can be null, in which case this is used to validate or count
+ only if the input contains invalid characters then
the return value is -1 */
static int packsms16(unsigned char *o, int udhl, unsigned char *udh, int udl, unsigned short *ud)
{
return p;
}
-/*! \brief general pack, with length and data,
+/*! \brief general pack, with length and data,
returns number of bytes of target used */
static int packsms(unsigned char dcs, unsigned char *base, unsigned int udhl, unsigned char *udh, int udl, unsigned short *ud)
{
if (udl == 0) {
*p++ = 0; /* no user data */
} else {
-
+
int l = 0;
if (is7bit(dcs)) { /* 7 bit */
if ((l = packsms7(p + 1, udhl, udh, udl, ud)) < 0) {
return ast_mktime(&t, NULL);
}
-/*! \brief unpacks bytes (7 bit encoding) at i, len l septets,
- and places in udh and ud setting udhl and udl. udh not used
+/*! \brief unpacks bytes (7 bit encoding) at i, len l septets,
+ and places in udh and ud setting udhl and udl. udh not used
if udhi not set */
static void unpacksms7(unsigned char *i, unsigned char l, unsigned char *udh, int *udhl, unsigned short *ud, int *udl, char udhi)
{
*udl = (o - ud);
}
-/*! \brief unpacks bytes (8 bit encoding) at i, len l septets,
- * and places in udh and ud setting udhl and udl. udh not used
+/*! \brief unpacks bytes (8 bit encoding) at i, len l septets,
+ * and places in udh and ud setting udhl and udl. udh not used
* if udhi not set.
*/
static void unpacksms8(unsigned char *i, unsigned char l, unsigned char *udh, int *udhl, unsigned short *ud, int *udl, char udhi)
}
/*! \brief unpacks bytes (16 bit encoding) at i, len l septets,
- and places in udh and ud setting udhl and udl.
+ and places in udh and ud setting udhl and udl.
udh not used if udhi not set */
static void unpacksms16(unsigned char *i, unsigned char l, unsigned char *udh, int *udhl, unsigned short *ud, int *udl, char udhi)
{
/*! \brief find and fill in next message, or send a REL if none waiting */
static void sms_nextoutgoing (sms_t * h)
-{
+{
char fn[100 + NAME_MAX] = "";
DIR *d;
char more = 0;
if (ast_test_flag(&flags, OPTION_DCS)) {
h.dcs = 1;
}
-#if 0
+#if 0
case '1':
case '2':
case '3':
res = h.err;
goto done;
}
-
+
if (ast_channel_state(chan) != AST_STATE_UP) { /* make sure channel is answered before any TX */
ast_answer(chan);
}
}
res = h.err; /* XXX */
- /*
+ /*
* The SMS generator data is on the stack. We _MUST_ make sure the generator
* is stopped before returning from this function.
*/
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "SMS/PSTN handler");
-
* \brief SoftHangup application
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
</option>
</optionlist>
</parameter>
- </syntax>
+ </syntax>
<description>
- <para>Hangs up the requested channel. If there are no channels to
+ <para>Hangs up the requested channel. If there are no channels to
hangup, the application will report it.</para>
</description>
</application>
AST_APP_ARG(options);
);
struct ast_channel_iterator *iter;
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "SoftHangup requires an argument (Technology/resource)\n");
return 0;
ast_channel_lock(c);
ast_copy_string(name, ast_channel_name(c), sizeof(name));
if (ast_test_flag(&flags, OPTION_ALL)) {
- /* CAPI is set up like CAPI[foo/bar]/clcnt */
+ /* CAPI is set up like CAPI[foo/bar]/clcnt */
if (!strcmp(ast_channel_tech(c)->type, "CAPI")) {
cut = strrchr(name, '/');
/* Basically everything else is Foo/Bar-Z */
and ${SPEECH_SCORE(1)}.</para>
<para>The first argument is the sound file and the second is the timeout integer in seconds.</para>
<para>Hangs up the channel on failure. If this is not desired, use TryExec.</para>
-
+
</description>
</application>
<application name="SpeechDeactivateGrammar" language="en_US">
if (data == NULL || speech == NULL || !(result = find_result(speech->results, data))) {
return -1;
}
-
+
snprintf(tmp, sizeof(tmp), "%d", result->score);
-
+
ast_copy_string(buf, tmp, len);
return 0;
if (!(fs = ast_openstream(chan, filename, preflang)))
return -1;
-
+
if (ast_applystream(chan, fs))
return -1;
-
+
ast_playstream(fs);
return 0;
if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_MAXLEN")) && !ast_strlen_zero(tmp2)) {
max_dtmf_len = atoi(tmp2);
}
-
+
/* See if a terminator is specified */
if ((tmp2 = pbx_builtin_getvar_helper(chan, "SPEECH_DTMF_TERMINATOR"))) {
if (ast_strlen_zero(tmp2))
res |= ast_custom_function_unregister(&speech_engine_function);
res |= ast_custom_function_unregister(&speech_results_type_function);
- return res;
+ return res;
}
static int load_module(void)
* \brief Stack applications Gosub, Return, etc.
*
* \author Tilghman Lesher <app_stack_v003@the-tilghman.com>
- *
+ *
* \ingroup applications
*/
***/
#include "asterisk.h"
-
+
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/pbx.h"
*/
while ((vardata = AST_LIST_REMOVE_HEAD(&frame->varshead, entries))) {
if (chan)
- pbx_builtin_setvar_helper(chan, ast_var_name(vardata), NULL);
+ pbx_builtin_setvar_helper(chan, ast_var_name(vardata), NULL);
ast_var_delete(vardata);
}
* \brief Execute arbitrary system commands
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
pbx_builtin_setvar_helper(chan, chanvar, "FAILURE");
res = failmode;
} else {
- if (res < 0)
+ if (res < 0)
res = 0;
if (res != 0)
pbx_builtin_setvar_helper(chan, chanvar, "APPERROR");
else
pbx_builtin_setvar_helper(chan, chanvar, "SUCCESS");
res = 0;
- }
+ }
ast_autoservice_stop(chan);
* \brief Playback a file with audio detect
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
ast_verb(3, "BackgroundDetect: Talk analysis time complete on %s.\n", ast_channel_name(chan));
}
}
-
+
if (!fr) {
res = -1;
break;
char ms_str[12];
ast_debug(1, "Found qualified token of %d ms\n", ms);
- /* Save detected talk time (in milliseconds) */
- snprintf(ms_str, sizeof(ms_str), "%d", ms);
+ /* Save detected talk time (in milliseconds) */
+ snprintf(ms_str, sizeof(ms_str), "%d", ms);
pbx_builtin_setvar_helper(chan, "TALK_DETECTED", ms_str);
ast_goto_if_exists(chan, ast_channel_context(chan), "talk", 1);
if (res > -1) {
if (origrformat && ast_set_read_format(chan, origrformat)) {
- ast_log(LOG_WARNING, "Failed to restore read format for %s to %s\n",
+ ast_log(LOG_WARNING, "Failed to restore read format for %s to %s\n",
ast_channel_name(chan), ast_format_get_name(origrformat));
}
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Playback with Talk Detection");
-
*
* \author Mark Spencer <markster@digium.com>
* \author Russell Bryant <russelb@clemson.edu>
- *
+ *
* \ingroup applications
*/
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Interface Test Application");
-
* \brief Transfer a caller
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* Requires transfer support from channel driver
*
* \ingroup applications
* \brief App to transmit a URL
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
AST_APP_ARG(url);
AST_APP_ARG(options);
);
-
+
if (ast_strlen_zero(data)) {
ast_log(LOG_WARNING, "SendURL requires an argument (URL)\n");
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
AST_STANDARD_APP_ARGS(args, tmp);
if (args.argc == 2)
ast_app_parse_options(app_opts, &flags, opts, args.options);
-
+
if (!ast_channel_supports_html(chan)) {
/* Does not support transport */
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", "UNSUPPORTED");
for(;;) {
/* Wait for an event */
res = ast_waitfor(chan, -1);
- if (res < 0)
+ if (res < 0)
break;
f = ast_read(chan);
if (!f) {
}
ast_frfree(f);
}
- }
-out:
+ }
+out:
pbx_builtin_setvar_helper(chan, "SENDURLSTATUS", status);
return res;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Send URL Applications");
-
/*! \file
*
* \brief UserEvent application -- send manager event
- *
+ *
* \ingroup applications
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page voicemail.conf voicemail.conf
* \verbinclude voicemail.conf.sample
*/
unsigned char iobuf[BASEMAXINLINE];
};
-/*! Structure for linked list of users
+/*! Structure for linked list of users
* Use ast_vm_user_destroy() to free one of these structures. */
struct ast_vm_user {
char context[AST_MAX_CONTEXT]; /*!< Voicemail context */
#define STORE(a,b,c,d,e,f,g,h,i,j,k)
#define EXISTS(a,b,c,d) (ast_fileexists(c,NULL,d) > 0)
#define RENAME(a,b,c,d,e,f,g,h) (rename_file(g,h));
-#define COPY(a,b,c,d,e,f,g,h) (copy_plain_file(g,h));
+#define COPY(a,b,c,d,e,f,g,h) (copy_plain_file(g,h));
#define DELETE(a,b,c,d) (vm_delete(c))
#define UPDATE_MSG_ID(a, b, c, d, e, f)
#endif
static int silencethreshold = 128;
static char serveremail[80];
static char mailcmd[160]; /* Configurable mail cmd */
-static char externnotify[160];
+static char externnotify[160];
static struct ast_smdi_interface *smdi_iface = NULL;
static char vmfmts[80];
static double volgain;
* \param vmu The voicemail user object to work with.
* \param var The name of the property to be set.
* \param value The value to be set to the property.
- *
+ *
* The property name must be one of the understood properties. See the source for details.
*/
static void apply_option(struct ast_vm_user *vmu, const char *var, const char *value)
vmu->imapversion = imapversion;
#endif
} else if (!strcasecmp(var, "delete") || !strcasecmp(var, "deletevoicemail")) {
- ast_set2_flag(vmu, ast_true(value), VM_DELETE);
+ ast_set2_flag(vmu, ast_true(value), VM_DELETE);
} else if (!strcasecmp(var, "saycid")){
- ast_set2_flag(vmu, ast_true(value), VM_SAYCID);
+ ast_set2_flag(vmu, ast_true(value), VM_SAYCID);
} else if (!strcasecmp(var, "sendvoicemail")){
- ast_set2_flag(vmu, ast_true(value), VM_SVMAIL);
+ ast_set2_flag(vmu, ast_true(value), VM_SVMAIL);
} else if (!strcasecmp(var, "review")){
ast_set2_flag(vmu, ast_true(value), VM_REVIEW);
} else if (!strcasecmp(var, "tempgreetwarn")){
- ast_set2_flag(vmu, ast_true(value), VM_TEMPGREETWARN);
+ ast_set2_flag(vmu, ast_true(value), VM_TEMPGREETWARN);
} else if (!strcasecmp(var, "messagewrap")){
- ast_set2_flag(vmu, ast_true(value), VM_MESSAGEWRAP);
+ ast_set2_flag(vmu, ast_true(value), VM_MESSAGEWRAP);
} else if (!strcasecmp(var, "operator")) {
- ast_set2_flag(vmu, ast_true(value), VM_OPERATOR);
+ ast_set2_flag(vmu, ast_true(value), VM_OPERATOR);
} else if (!strcasecmp(var, "envelope")){
- ast_set2_flag(vmu, ast_true(value), VM_ENVELOPE);
+ ast_set2_flag(vmu, ast_true(value), VM_ENVELOPE);
} else if (!strcasecmp(var, "moveheard")){
ast_set2_flag(vmu, ast_true(value), VM_MOVEHEARD);
} else if (!strcasecmp(var, "sayduration")){
- ast_set2_flag(vmu, ast_true(value), VM_SAYDURATION);
+ ast_set2_flag(vmu, ast_true(value), VM_SAYDURATION);
} else if (!strcasecmp(var, "saydurationm")){
if (sscanf(value, "%30d", &x) == 1) {
vmu->saydurationm = x;
ast_log(AST_LOG_WARNING, "Invalid min duration for say duration\n");
}
} else if (!strcasecmp(var, "forcename")){
- ast_set2_flag(vmu, ast_true(value), VM_FORCENAME);
+ ast_set2_flag(vmu, ast_true(value), VM_FORCENAME);
} else if (!strcasecmp(var, "forcegreetings")){
- ast_set2_flag(vmu, ast_true(value), VM_FORCEGREET);
+ ast_set2_flag(vmu, ast_true(value), VM_FORCEGREET);
} else if (!strcasecmp(var, "callback")) {
ast_copy_string(vmu->callback, value, sizeof(vmu->callback));
} else if (!strcasecmp(var, "dialout")) {
}
}
-static char *vm_check_password_shell(char *command, char *buf, size_t len)
+static char *vm_check_password_shell(char *command, char *buf, size_t len)
{
int fds[2], pid = 0;
AST_NONSTANDARD_APP_ARGS(arg, mycmd, ' ');
- execv(arg.v[0], arg.v);
+ execv(arg.v[0], arg.v);
printf("FAILURE: %s", strerror(errno));
_exit(0);
}
return 0;
}
-/*!
+/*!
* \brief Performs a change of the voicemail passowrd in the realtime engine.
* \param vmu The voicemail user to change the password for.
* \param password The new value to be set to the password for this user.
- *
+ *
* This only works if there is a realtime engine configured.
* This is called from the (top level) vm_change_password.
*
* \brief Destructively Parse options and apply.
*/
static void apply_options(struct ast_vm_user *vmu, const char *options)
-{
+{
char *stringp;
char *s;
char *var, *value;
if ((var = strsep(&value, "=")) && value) {
apply_option(vmu, var, value);
}
- }
+ }
}
/*!
* \brief Loads the options specific to a voicemail user.
- *
+ *
* This is called when a vm_user structure is being set up, such as from load_options.
*/
static void apply_options_full(struct ast_vm_user *retval, struct ast_variable *var)
* \brief Determines if a DTMF key entered is valid.
* \param key The character to be compared. expects a single character. Though is capable of handling a string, this is internally copies using ast_strdupa.
*
- * Tests the character entered against the set of valid DTMF characters.
+ * Tests the character entered against the set of valid DTMF characters.
* \return 1 if the character entered is a valid DTMF digit, 0 if the character is invalid.
*/
static int is_valid_dtmf(const char *key)
if (var) {
apply_options_full(retval, var);
ast_variables_destroy(var);
- } else {
- if (!ivm)
+ } else {
+ if (!ivm)
ast_free(retval);
retval = NULL;
- }
- }
+ }
+ }
return retval;
}
* \param ivm
* \param context
* \param mailbox
- *
+ *
* \return The ast_vm_user structure for the user that was found.
*/
static struct ast_vm_user *find_user(struct ast_vm_user *ivm, const char *context, const char *mailbox)
return cfg && cfg != CONFIG_STATUS_FILEINVALID;
}
-/*!
+/*!
* \brief The handler for the change password option.
* \param vmu The voicemail user to work with.
* \param newpassword The new password (that has been gathered from the appropriate prompting).
}
}
-/*!
+/*!
* \brief Creates a file system path expression for a folder within the voicemail data folder and the appropriate context.
* \param dest The variable to hold the output generated path expression. This buffer should be of size PATH_MAX.
* \param len The length of the path string that was written out.
* \param context
- * \param ext
- * \param folder
- *
- * The path is constructed as
+ * \param ext
+ * \param folder
+ *
+ * The path is constructed as
* VM_SPOOL_DIRcontext/ext/folder
*
* \return zero on success, -1 on error.
return snprintf(dest, len, "%s%s/%s/%s", VM_SPOOL_DIR, context, ext, folder);
}
-/*!
+/*!
* \brief Creates a file system path expression for a folder within the voicemail data folder and the appropriate context.
* \param dest The variable to hold the output generated path expression. This buffer should be of size PATH_MAX.
* \param len The length of the path string that was written out.
- * \param dir
- * \param num
- *
- * The path is constructed as
+ * \param dir
+ * \param num
+ *
+ * The path is constructed as
* VM_SPOOL_DIRcontext/ext/folder
*
* \return zero on success, -1 on error.
* \param len Length of dest.
* \param context String. Ignored if is null or empty string.
* \param ext String. Ignored if is null or empty string.
- * \param folder String. Ignored if is null or empty string.
+ * \param folder String. Ignored if is null or empty string.
* \return -1 on failure, 0 on success.
*/
static int create_dirpath(char *dest, int len, const char *context, const char *ext, const char *folder)
}
/* check if someone is accessing this box right now... */
- if (!(vms_p = get_vm_state_by_mailbox(vmu->mailbox, vmu->context, 1)) &&
+ if (!(vms_p = get_vm_state_by_mailbox(vmu->mailbox, vmu->context, 1)) &&
!(vms_p = get_vm_state_by_mailbox(vmu->mailbox, vmu->context, 0))) {
- /* Unlike when retrieving a message, it is reasonable not to be able to find a
+ /* Unlike when retrieving a message, it is reasonable not to be able to find a
* vm_state for a mailbox when trying to retrieve a greeting. Just create one,
* that's all we need to do.
*/
res = -1;
goto exit;
}
-
+
/* Find the format of the attached file */
strsep(&attachedfilefmt, ".");
res = -1;
goto exit;
}
-
+
save_body(body, vms, "2", attachedfilefmt, 0);
if (save_body(body, vms, "3", attachedfilefmt, 1)) {
*vms->introfn = '\0';
int ret = 0;
int fold = folder_int(folder);
int urgent = 0;
-
+
/* If URGENT, then look at INBOX */
if (fold == 11) {
fold = NEW_FOLDER;
* \brief Gets the number of messages that exist in a mailbox folder.
* \param mailbox_id
* \param folder
- *
+ *
* This method is used when IMAP backend is used.
* \return The number of messages in this mailbox folder (zero or more).
*/
* \param newmsgs The variable that is updated with the count of new messages within this inbox.
* \param oldmsgs The variable that is updated with the count of old messages within this inbox.
* \param urgentmsgs The variable that is updated with the count of urgent messages within this inbox.
- *
+ *
* This method is used when IMAP backend is used.
* Simultaneously determines the count of new,old, and urgent messages. The total messages would then be the sum of these three.
*
return -1;
else {
if (newmsgs)
- *newmsgs += tmpnew;
+ *newmsgs += tmpnew;
if (oldmsgs)
*oldmsgs += tmpold;
if (urgentmsgs)
return 0;
}
-/**
+/**
* \brief Determines if the given folder has messages.
* \param mailbox The @ delimited string for user@context. If no context is found, uses 'default' for the context.
* \param folder the folder to look in
{
char tmp[256], *t = tmp;
size_t left = sizeof(tmp);
-
+
if (box == OLD_FOLDER) {
ast_copy_string(vms->curbox, mbox(NULL, NEW_FOLDER), sizeof(vms->curbox));
} else {
}
AST_LIST_TRAVERSE_SAFE_END
AST_LIST_UNLOCK(&vmstates);
-
+
if (vc) {
ast_mutex_destroy(&vc->vms->lock);
ast_free(vc->vms->msgArray);
return 0;
}
-/*!
- * \brief Get delimiter via mm_list callback
+/*!
+ * \brief Get delimiter via mm_list callback
* \param vms The voicemail state object
* \param stream
*
mail_list(stream, tmp, "*");
}
-/*!
- * \brief Check Quota for user
+/*!
+ * \brief Check Quota for user
* \param vms a pointer to a vm_state struct, will use the mailstream property of this.
* \param mailbox the mailbox to check the quota for.
*
*
* Removes the message content file and the information file.
* This method is used by the DISPOSE macro when mailboxes are stored in an ODBC back end.
- * Typical use is to clean up after a RETRIEVE operation.
+ * Typical use is to clean up after a RETRIEVE operation.
* Note that this does not remove the message from the mailbox folders, to do that we would use delete_file().
* \return zero on success, -1 on error.
*/
char fn[PATH_MAX];
char full_fn[PATH_MAX];
char msgnums[80];
-
+
if (msgnum > -1) {
snprintf(msgnums, sizeof(msgnums), "%d", msgnum);
make_file(fn, sizeof(fn), dir, msgnum);
} else
ast_copy_string(fn, dir, sizeof(fn));
- ast_filedelete(fn, NULL);
+ ast_filedelete(fn, NULL);
snprintf(full_fn, sizeof(full_fn), "%s.txt", fn);
unlink(full_fn);
return 0;
closedir(vmdir);
}
ast_unlock_path(dir);
-
+
return vmcount;
}
rename(stxt, dtxt);
}
-/*!
+/*!
* \brief Determines the highest message number in use for a given user and mailbox folder.
- * \param vmu
+ * \param vmu
* \param dir the folder the mailbox folder to look for messages. Used to construct the SQL where clause.
*
* This method is used when mailboxes are stored on the filesystem. (not ODBC and not IMAP).
/*!
* \brief Copies a voicemail information (envelope) file.
* \param frompath
- * \param topath
+ * \param topath
*
* Every voicemail has the data (.wav) file, and the information file.
* This function performs the file system copying of the information file for a voicemail, handling the internal fields and their values.
}
#endif
-/*!
+/*!
* \brief Removes the voicemail sound and information file.
* \param file The path to the sound file. This will be the the folder and message index, without the extension.
*
}
fclose(fi);
-
+
if (fputs(ENDL, so) == EOF) {
return 0;
}
* \param from The string to work with.
* \param buf The buffer into which to write the modified quoted string.
* \param maxlen Always zero, but see \see ast_str
- *
+ *
* \return The destination string with quotes wrapped on it (the to field).
*/
static const char *ast_str_quote(struct ast_str **buf, ssize_t maxlen, const char *from)
* \param srcemail The email address to send the email to, presumably the email address for the owner of the mailbox.
* \param vmu The voicemail user who is sending the voicemail.
* \param msgnum The message index in the mailbox folder.
- * \param context
+ * \param context
* \param mailbox The voicemail box to read the voicemail to be notified in this email.
* \param fromfolder
* \param cidnum The caller ID number.
* \param cidname The caller ID name.
* \param attach the name of the sound file to be attached to the email, if attach_user_voicemail == 1.
- * \param attach2
+ * \param attach2
* \param format The message sound file format. i.e. .wav
* \param duration The time of the message content, in seconds.
* \param attach_user_voicemail if 1, the sound file is attached to the email.
struct ast_tm tm;
char enc_cidnum[256] = "", enc_cidname[256] = "";
struct ast_str *str1 = ast_str_create(16), *str2 = ast_str_create(16);
- char *greeting_attachment;
+ char *greeting_attachment;
char filename[256];
int first_line;
char *emailsbuf;
* \brief Gets the current date and time, as formatted string.
* \param s The buffer to hold the output formatted date.
* \param len the length of the buffer. Used to prevent buffer overflow in ast_strftime.
- *
+ *
* The date format string used is "%a %b %e %r UTC %Y".
- *
+ *
* \return zero on success, -1 on error.
*/
static int get_date(char *s, int len)
return nummsgs;
}
-/**
+/**
* \brief Determines if the given folder has messages.
* \param mailbox The @ delimited string for user@context. If no context is found, uses 'default' for the context.
- *
+ *
* This function is used when the mailbox is stored in an ODBC back end.
* This invokes the messagecount(). Here we are interested in the presence of messages (> 0) only, not the actual count.
* \return 1 if the folder has one or more messages. zero otherwise.
}
#endif
#ifndef IMAP_STORAGE
-/*!
+/*!
* \brief Copies a message from one mailbox to another.
* \param chan
* \param vmu
return ret;
}
-/**
+/**
* \brief Determines if the given folder has messages.
* \param mailbox The \@ delimited string for user\@context. If no context is found, uses 'default' for the context.
* \param folder the folder to look in
return -1;
else {
if (newmsgs)
- *newmsgs += tmpnew;
+ *newmsgs += tmpnew;
if (oldmsgs)
*oldmsgs += tmpold;
if (urgentmsgs)
}
ast_copy_string(tmp, mailbox, sizeof(tmp));
-
+
if ((context = strchr(tmp, '@')))
*context++ = '\0';
else
ast_copy_string(ext_context, extension, sizeof(ext_context));
if (smdi_iface) {
- if (ast_app_has_voicemail(ext_context, NULL))
+ if (ast_app_has_voicemail(ext_context, NULL))
ast_smdi_mwi_set(smdi_iface, extension);
else
ast_smdi_mwi_unset(smdi_iface, extension);
* \param chan
* \param ext
* \param options OPT_BUSY_GREETING, OPT_UNAVAIL_GREETING
- *
- *
- *
+ *
+ *
+ *
* \return zero on success, -1 on error.
*/
static int leave_voicemail(struct ast_channel *chan, char *ext, struct leave_vm_options *options)
else
ast_copy_string(ext_context, vmu->mailbox, sizeof(ext_context));
- /* Set the path to the prefile. Will be one of
+ /* Set the path to the prefile. Will be one of
VM_SPOOL_DIRcontext/ext/busy
VM_SPOOL_DIRcontext/ext/unavail
Depending on the flag set in options.
/* Play the beginning intro if desired */
if (!ast_strlen_zero(prefile)) {
#ifdef ODBC_STORAGE
- int success =
+ int success =
#endif
RETRIEVE(prefile, -1, ext, context);
if (ast_fileexists(prefile, NULL, NULL) > 0) {
- if (ast_streamfile(chan, prefile, ast_channel_language(chan)) > -1)
+ if (ast_streamfile(chan, prefile, ast_channel_language(chan)) > -1)
res = ast_waitstream(chan, ecodes);
#ifdef ODBC_STORAGE
if (success == -1) {
/* Unless we're *really* silent, try to send the beep */
res = ast_stream_and_wait(chan, "beep", "");
}
-
+
/* Store information in real-time storage */
if (ast_check_realtime("voicemail_data")) {
snprintf(priority, sizeof(priority), "%d", ast_channel_priority(chan));
S_COR(ast_channel_caller(chan)->id.name.valid, ast_channel_caller(chan)->id.name.str, NULL),
S_COR(ast_channel_caller(chan)->id.number.valid, ast_channel_caller(chan)->id.number.str, NULL),
"Unknown");
- fprintf(txt,
+ fprintf(txt,
";\n"
"; Message Information file\n"
";\n"
"msg_id=%s\n",
ext,
ast_channel_context(chan),
- ast_channel_macrocontext(chan),
+ ast_channel_macrocontext(chan),
ast_channel_exten(chan),
S_COR(ast_channel_redirecting(chan)->from.number.valid,
ast_channel_redirecting(chan)->from.number.str, "unknown"),
#endif
make_file(fn, sizeof(fn), dir, msgnum);
- /* assign a variable with the name of the voicemail file */
+ /* assign a variable with the name of the voicemail file */
#ifndef IMAP_STORAGE
pbx_builtin_setvar_helper(chan, "VM_MESSAGEFILE", fn);
#else
#ifdef HAVE_IMAP_TK2006
if (LEVELUIDPLUS (vms->mailstream)) {
mail_expunge_full(vms->mailstream, NIL, EX_UID);
- } else
+ } else
#endif
mail_expunge(vms->mailstream);
ast_mutex_unlock(&vms->lock);
static void adsi_message(struct ast_channel *chan, struct vm_state *vms)
{
int bytes = 0;
- unsigned char buf[256];
+ unsigned char buf[256];
char buf1[256], buf2[256];
char fn2[PATH_MAX];
snprintf(fn2, sizeof(fn2), "%s.txt", vms->fn);
f = fopen(fn2, "r");
if (f) {
- while (!feof(f)) {
+ while (!feof(f)) {
if (!fgets((char *) buf, sizeof(buf), f)) {
continue;
}
bytes += ast_adsi_voice_mode(buf + bytes, 0);
ast_adsi_transmit_message(chan, buf, bytes, ADSI_MSG_DISPLAY);
-
+
}
/*
* \param start Does not appear to be used at this time.
*
* This is used by the main menu option to move a message to a folder or to save a message into a folder.
- * After playing the message identified by the fn parameter value, it calls get_folder(), which plays the
+ * After playing the message identified by the fn parameter value, it calls get_folder(), which plays the
* prompting for the number inputs that correspond to the available folders.
- *
+ *
* \return zero on success, or -1 on error.
*/
static int get_folder2(struct ast_channel *chan, char *fn, int start)
* \param record_gain
* \param duration
* \param vms
- * \param flag
+ * \param flag
*
* Presents a prompt for 1 to prepend the current message, 2 to forward the message without prepending, or * to return to the main menu.
*
if (cmd)
retries = 0;
switch (cmd) {
- case '1':
+ case '1':
#ifdef IMAP_STORAGE
/* Record new intro file */
if (record_gain)
ast_channel_setoption(chan, AST_OPTION_RXGAIN, &zero_gain, sizeof(zero_gain), 0);
-
+
if ((duration_str = ast_variable_retrieve(msg_cfg, "message", "duration")))
*duration = atoi(duration_str);
#endif
break;
- case '2':
+ case '2':
/* NULL out introfile so we know there is no intro! */
#ifdef IMAP_STORAGE
*vms->introfn = '\0';
case '*':
cmd = '*';
break;
- default:
+ default:
/* If time_out and return to menu, reset already_recorded */
already_recorded = 0;
DELETE(todir, msgnum, fn, vmu);
/* Leave voicemail for someone */
- if (ast_app_has_voicemail(ext_context, NULL))
+ if (ast_app_has_voicemail(ext_context, NULL))
ast_app_inboxcount2(ext_context, &urgentmsgs, &newmsgs, &oldmsgs);
queue_mwi_event(ast_channel_uniqueid(chan), ext_context, urgentmsgs, newmsgs, oldmsgs);
* \param vms
* \param sender
* \param fmt
- * \param is_new_message Used to indicate the mode for which this method was invoked.
+ * \param is_new_message Used to indicate the mode for which this method was invoked.
* Will be 0 when called to forward an existing message (option 8)
* Will be 1 when called to leave a message (option 3->5)
- * \param record_gain
+ * \param record_gain
* \param urgent
*
* Reads the destination mailbox(es) from keypad input for CID, or if use_directory feature is enabled, the Directory.
- *
+ *
* When in the leave message mode (is_new_message == 1):
* - allow the leaving of a message for ourselves. (Will not allow us to forward a message to ourselves, when is_new_message == 0).
* - attempt to determine the context and and mailbox, and then invoke leave_message() function to record and store the message.
if (cmd)
retries = 0;
switch (cmd) {
- case '1':
+ case '1':
use_directory = 0;
done = 1;
break;
- case '2':
+ case '2':
use_directory = 1;
done = 1;
break;
- case '*':
+ case '*':
cmd = 't';
done = 1;
break;
- default:
+ default:
/* Press 1 to enter an extension press 2 to use the directory */
cmd = ast_play_and_wait(chan, "vm-forward");
if (!cmd) {
#ifdef IMAP_STORAGE
int attach_user_voicemail;
char *myserveremail = serveremail;
-
+
/* get destination mailbox */
dstvms = get_vm_state_by_mailbox(vmtmp->mailbox, vmtmp->context, 0);
if (!dstvms) {
ast_log(AST_LOG_ERROR, "IMAP mailstream for %s is NULL\n", vmtmp->mailbox);
} else {
copy_msg_result = STORE(vmstmp.curdir, vmtmp->mailbox, vmtmp->context, curmsg, chan, vmtmp, fmt, duration, dstvms, urgent_str, msg_id);
- run_externnotify(vmtmp->context, vmtmp->mailbox, urgent_str);
+ run_externnotify(vmtmp->context, vmtmp->mailbox, urgent_str);
}
} else {
ast_log(AST_LOG_ERROR, "Could not find state information for mailbox %s\n", vmtmp->mailbox);
static int wait_file2(struct ast_channel *chan, struct vm_state *vms, char *file)
{
int res;
- if ((res = ast_stream_and_wait(chan, file, AST_DIGIT_ANY)) < 0)
- ast_log(AST_LOG_WARNING, "Unable to play message %s\n", file);
+ if ((res = ast_stream_and_wait(chan, file, AST_DIGIT_ANY)) < 0)
+ ast_log(AST_LOG_WARNING, "Unable to play message %s\n", file);
return res;
}
-static int wait_file(struct ast_channel *chan, struct vm_state *vms, char *file)
+static int wait_file(struct ast_channel *chan, struct vm_state *vms, char *file)
{
ast_test_suite_event_notify("PLAYVOICE", "Message: Playing %s", file);
return ast_control_streamfile(chan, file, listen_control_forward_key, listen_control_reverse_key, listen_control_stop_key, listen_control_pause_key, listen_control_restart_key, skipms, NULL);
char fn[PATH_MAX];
char full_fn[PATH_MAX];
char intro[PATH_MAX] = {0,};
-
+
if (msgnum > -1) {
make_file(fn, sizeof(fn), dir, msgnum);
snprintf(intro, sizeof(intro), "%sintro", fn);
} else
ast_copy_string(fn, dir, sizeof(fn));
-
+
if ((msgnum < 0 && imapgreetings) || msgnum > -1) {
ast_filedelete(fn, NULL);
if (!ast_strlen_zero(intro)) {
if (vms->newmessages) {
res = ast_play_and_wait(chan, "vm-youhave");
- if (!res)
+ if (!res)
res = ast_say_number(chan, vms->newmessages, AST_DIGIT_ANY, ast_channel_language(chan), NULL);
if (!res) {
if (vms->newmessages == 1) {
if (!res)
res = ast_play_and_wait(chan, "vm-messages");
}
- } else if (!vms->oldmessages && !vms->newmessages)
- res = ast_play_and_wait(chan, "vm-denExeteMynhmata");
+ } else if (!vms->oldmessages && !vms->newmessages)
+ res = ast_play_and_wait(chan, "vm-denExeteMynhmata");
return res;
}
/* Version of vm_intro() designed to work for many languages.
*
- * It is hoped that this function can prevent the proliferation of
+ * It is hoped that this function can prevent the proliferation of
* language-specific vm_intro() functions and in time replace the language-
* specific functions which already exist. An examination of the language-
* specific functions revealed that they all corrected the same deficiencies
* in vm_intro_en() (which was the default function). Namely:
*
- * 1) The vm-Old and vm-INBOX sound files were overloaded. The English
+ * 1) The vm-Old and vm-INBOX sound files were overloaded. The English
* wording of the voicemail greeting hides this problem. For example,
* vm-INBOX contains only the word "new". This means that both of these
* sequences produce valid utterances:
* 3) Call ast_say_counted_adjective() to put the proper gender and number
* prefix on vm-new and vm-old (none for English).
* 4) Pass the gender of the language's word for "message" as an agument to
- * this function which is can in turn pass on to the functions which
+ * this function which is can in turn pass on to the functions which
* say numbers and put endings on nounds and adjectives.
*
* All languages require these messages:
if (vms->oldmessages == 2) {
res = ast_play_and_wait(chan, "vm-shtei");
} else {
- res = ast_say_number(chan, vms->oldmessages, AST_DIGIT_ANY, ast_channel_language(chan), "f");
+ res = ast_say_number(chan, vms->oldmessages, AST_DIGIT_ANY, ast_channel_language(chan), "f");
}
res = ast_play_and_wait(chan, "vm-Old");
}
}
return res;
} /* Japanese */
-
+
/* Default English syntax */
static int vm_intro_en(struct ast_channel *chan, struct vm_state *vms)
{
else
res = ast_play_and_wait(chan, "vm-messages");
}
-
+
}
if (!res && vms->oldmessages) {
res = say_and_wait(chan, vms->oldmessages, ast_channel_language(chan));
else
res = ast_play_and_wait(chan, "vm-messages");
}
-
+
}
if (!res && vms->oldmessages) {
if (vms->oldmessages == 1)
else
res = ast_play_and_wait(chan, "vm-messages");
}
-
+
}
if (!res && vms->oldmessages) {
res = say_and_wait(chan, vms->oldmessages, ast_channel_language(chan));
else
res = ast_play_and_wait(chan, "vm-messages");
}
-
+
}
if (!res && vms->oldmessages) {
res = say_and_wait(chan, vms->oldmessages, ast_channel_language(chan));
/* in czech there must be declension of word new and message
* czech : english : czech : english
* --------------------------------------------------------
- * vm-youhave : you have
+ * vm-youhave : you have
* vm-novou : one new : vm-zpravu : message
* vm-nove : 2-4 new : vm-zpravy : messages
* vm-novych : 5-infinite new : vm-zprav : messages
* vm-starou : one old
- * vm-stare : 2-4 old
+ * vm-stare : 2-4 old
* vm-starych : 5-infinite old
- * jednu : one - falling 4.
+ * jednu : one - falling 4.
* vm-no : no ( no messages )
*/
res = ast_play_and_wait(chan, "vm-INBOX");
if (vms->oldmessages && !res)
res = ast_play_and_wait(chan, "vm-and");
- else if (!res)
+ else if (!res)
res = ast_play_and_wait(chan, "vm-messages");
}
if (!res && vms->oldmessages) {
if (!res && vms->oldmessages) {
res = say_and_wait(chan, vms->oldmessages, ast_channel_language(chan));
if (!res)
- res = ast_play_and_wait(chan, "vm-Old");
+ res = ast_play_and_wait(chan, "vm-Old");
}
if (!res) {
if (!vms->oldmessages && !vms->newmessages) {
static int vm_intro(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms)
{
char prefile[256];
-
+
/* Notify the user that the temp greeting is set and give them the option to remove it */
snprintf(prefile, sizeof(prefile), "%s%s/%s/temp", VM_SPOOL_DIR, vmu->context, vms->username);
if (ast_test_flag(vmu, VM_TEMPGREETWARN)) {
}
/*!
- * \brief The handler for 'record a temporary greeting'.
+ * \brief The handler for 'record a temporary greeting'.
* \param chan
* \param vmu
* \param vms
if (cmd == -1) {
break;
}
- cmd = 't';
+ cmd = 't';
} else {
switch (cmd) {
case '1':
case '2':
DELETE(prefile, -1, prefile, vmu);
ast_play_and_wait(chan, "vm-tempremoved");
- cmd = 't';
+ cmd = 't';
break;
- case '*':
+ case '*':
cmd = 't';
break;
default:
* \param vmu
*
* \return zero on success, -1 on error.
- */
+ */
static int vm_browse_messages_gr(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
{
int cmd = 0;
cmd = ast_play_and_wait(chan, vms->fn);
}
}
- }
+ }
return cmd;
}
return cmd;
}
-/*!
+/*!
* \brief Default English syntax for 'You have N messages' greeting.
* \param chan
* \param vms
cmd = play_message(chan, vmu, vms);
} else {
cmd = ast_play_and_wait(chan, "vm-youhave");
- if (!cmd)
+ if (!cmd)
cmd = ast_play_and_wait(chan, "vm-no");
if (!cmd) {
snprintf(vms->fn, sizeof(vms->fn), "vm-%s", vms->curbox);
return cmd;
}
-/*!
+/*!
*\brief Italian syntax for 'You have N messages' greeting.
* \param chan
* \param vms
return cmd;
}
-/*!
+/*!
* \brief Spanish syntax for 'You have N messages' greeting.
* \param chan
* \param vms
return cmd;
}
-/*!
+/*!
* \brief Portuguese syntax for 'You have N messages' greeting.
* \param chan
* \param vms
return cmd;
}
-/*!
+/*!
* \brief Chinese (Taiwan)syntax for 'You have N messages' greeting.
* \param chan
* \param vms
cmd = play_message(chan, vmu, vms);
} else {
cmd = ast_play_and_wait(chan, "vm-you");
- if (!cmd)
+ if (!cmd)
cmd = ast_play_and_wait(chan, "vm-haveno");
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-messages");
return cmd;
}
-/*!
+/*!
* \brief Vietnamese syntax for 'You have N messages' greeting.
* \param chan
* \param vms
* \param chan The channel for the current user. We read the language property from this.
* \param vms passed into the language-specific vm_browse_messages function.
* \param vmu passed into the language-specific vm_browse_messages function.
- *
+ *
* The method to be invoked is determined by the value of language code property in the user's channel.
* The default (when unable to match) is to use english.
*
if (ast_channel_caller(chan)->id.number.valid && ast_channel_caller(chan)->id.number.str) {
ast_copy_string(mailbox, ast_channel_caller(chan)->id.number.str, mailbox_size);
} else {
- ast_verb(3, "Username not entered\n");
+ ast_verb(3, "Username not entered\n");
return -1;
}
} else if (mailbox[0] == '*') {
ast_set_flag(&flags, OPT_SILENT);
else if (*(args.argv0) == 'p')
ast_set_flag(&flags, OPT_PREPEND_MAILBOX);
- else
+ else
break;
(args.argv0)++;
}
res = 0;
/* Check to see if this is a new user */
- if (!strcasecmp(vmu->mailbox, vmu->password) &&
+ if (!strcasecmp(vmu->mailbox, vmu->password) &&
(ast_test_flag(vmu, VM_FORCENAME | VM_FORCEGREET))) {
if (ast_play_and_wait(chan, vm_newuser) == -1)
ast_log(AST_LOG_WARNING, "Couldn't stream new user file\n");
snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(vmu, box));
if (!cmd) {
cmd = ast_play_and_wait(chan, "vm-message");
- if (!cmd)
+ if (!cmd)
cmd = say_and_wait(chan, vms.curmsg + 1, ast_channel_language(chan));
if (!cmd)
cmd = ast_play_and_wait(chan, "vm-savedto");
if (valid && res != OPERATOR_EXIT) {
if (silentexit)
res = ast_play_and_wait(chan, "vm-dialout");
- else
+ else
res = ast_play_and_wait(chan, "vm-goodbye");
}
if ((valid && res > 0) || res == OPERATOR_EXIT) {
AST_APP_ARG(argv0);
AST_APP_ARG(argv1);
);
-
+
memset(&leave_options, 0, sizeof(leave_options));
if (ast_channel_state(chan) != AST_STATE_UP)
return NULL;
}
}
-
+
if (!(vmu = ast_calloc(1, sizeof(*vmu))))
return NULL;
-
+
ast_copy_string(vmu->context, context, sizeof(vmu->context));
ast_copy_string(vmu->mailbox, box, sizeof(vmu->mailbox));
AST_LIST_INSERT_TAIL(&users, vmu, list);
-
+
return vmu;
}
}
#endif
-static int vm_box_exists(struct ast_channel *chan, const char *data)
+static int vm_box_exists(struct ast_channel *chan, const char *data)
{
struct ast_vm_user svm, *vmu;
char *context, *box;
char *options = NULL;
int silent = 0, skipuser = 0;
int res = -1;
-
+
if (data) {
s = ast_strdupa(data);
user = strsep(&s, ",");
struct ast_config *cfg;
const char *cat = NULL;
- if (!(cfg = ast_load_realtime_multientry("voicemail",
+ if (!(cfg = ast_load_realtime_multientry("voicemail",
"context", context, SENTINEL))) {
return CLI_FAILURE;
}
return NULL;
case CLI_GENERATE:
return complete_voicemail_show_users(a->line, a->word, a->pos, a->n);
- }
+ }
if ((a->argc < 3) || (a->argc > 5) || (a->argc == 4))
return CLI_SHOWUSAGE;
if (a->argc != 2)
return CLI_SHOWUSAGE;
- ast_cli(a->fd, "Reloading voicemail configuration...\n");
+ ast_cli(a->fd, "Reloading voicemail configuration...\n");
load_config(1);
-
+
return CLI_SUCCESS;
}
AST_LIST_UNLOCK(&users);
return RESULT_SUCCESS;
}
-
+
astman_send_listack(s, m, "Voicemail user list will follow", "start");
-
+
AST_LIST_TRAVERSE(&users, vmu, list) {
char dirname[256];
#ifdef IMAP_STORAGE
inboxcount(vmu->mailbox, &new, &old);
#endif
-
+
make_dir(dirname, sizeof(dirname), vmu->context, vmu->mailbox, "INBOX");
astman_append(s,
"Event: VoicemailUserEntry\r\n"
#endif
);
++num_users;
- }
+ }
astman_send_list_complete_start(s, m, "VoicemailUserEntryComplete", num_users);
astman_send_list_complete_end(s);
}
/*! \brief Free the users structure. */
-static void free_vm_users(void)
+static void free_vm_users(void)
{
struct ast_vm_user *current;
AST_LIST_LOCK(&users);
struct ast_str *str = ast_str_thread_get(&ast_str_thread_global_buf, strlen(value) + 16);
ast_str_reset(str);
-
+
/* Substitute strings \r, \n, and \t into the appropriate characters */
for (current = (char *) value; *current; current++) {
if (*current == '\\') {
/* Free all the zones structure */
free_vm_zones();
- AST_LIST_LOCK(&users);
+ AST_LIST_LOCK(&users);
memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
memset(ext_pass_check_cmd, 0, sizeof(ext_pass_check_cmd));
val = "default";
ast_copy_string(userscontext, val, sizeof(userscontext));
/* Attach voice message to mail message ? */
- if (!(val = ast_variable_retrieve(cfg, "general", "attach")))
+ if (!(val = ast_variable_retrieve(cfg, "general", "attach")))
val = "yes";
- ast_set2_flag((&globalflags), ast_true(val), VM_ATTACH);
+ ast_set2_flag((&globalflags), ast_true(val), VM_ATTACH);
if (!(val = ast_variable_retrieve(cfg, "general", "searchcontexts")))
val = "no";
if ((val = ast_variable_retrieve(cfg, "general", "odbctable"))) {
ast_copy_string(odbc_table, val, sizeof(odbc_table));
}
-#endif
+#endif
/* Mail command */
strcpy(mailcmd, SENDMAIL);
if ((val = ast_variable_retrieve(cfg, "general", "mailcmd")))
if (maxsilence > 0)
maxsilence *= 1000;
}
-
+
if (!(val = ast_variable_retrieve(cfg, "general", "maxmsg"))) {
maxmsg = MAXMSG;
} else {
}
/* There is some very unorthodox casting done here. This is due
- * to the way c-client handles the argument passed in. It expects a
+ * to the way c-client handles the argument passed in. It expects a
* void pointer and casts the pointer directly to a long without
* first dereferencing it. */
if ((val = ast_variable_retrieve(cfg, "general", "imapreadtimeout"))) {
val = ast_variable_retrieve(cfg, "general", "format");
if (!val) {
- val = "wav";
+ val = "wav";
} else {
tmp = ast_strdupa(val);
val = ast_format_str_reduce(tmp);
if ((val = ast_variable_retrieve(cfg, "general", "listen-control-stop-key")) && is_valid_dtmf(val))
ast_copy_string(listen_control_stop_key, val, sizeof(listen_control_stop_key));
- if (!(val = ast_variable_retrieve(cfg, "general", "usedirectory")))
+ if (!(val = ast_variable_retrieve(cfg, "general", "usedirectory")))
val = "no";
- ast_set2_flag((&globalflags), ast_true(val), VM_DIRECFORWARD);
+ ast_set2_flag((&globalflags), ast_true(val), VM_DIRECFORWARD);
if (!(val = ast_variable_retrieve(cfg, "general", "passwordlocation"))) {
val = "voicemail.conf";
}
/* load mailboxes from users.conf */
- if (ucfg) {
+ if (ucfg) {
for (cat = ast_category_browse(ucfg, NULL); cat ; cat = ast_category_browse(ucfg, cat)) {
if (!strcasecmp(cat, "general")) {
continue;
/* hasvm-old, hasvm-urgent, hasvm-new, ic-old, ic-urgent, ic-new, ic2-old, ic2-urgent, ic2-new, mc-old, mc-urgent, mc-new */
for (j = 0; j < 3; j++) {
- /* folder[2] is INBOX, __has_voicemail will default back to INBOX */
+ /* folder[2] is INBOX, __has_voicemail will default back to INBOX */
if (ast_app_has_voicemail(testspec, (j==2 ? NULL : folders[j])) != expected_results[i][0 + j]) {
ast_test_status_update(test, "has_voicemail(%s, %s) returned %d and we expected %d\n",
testspec, folders[j], ast_app_has_voicemail(testspec, folders[j]), expected_results[i][0 + j]);
/* compute the location of the voicemail spool directory */
snprintf(VM_SPOOL_DIR, sizeof(VM_SPOOL_DIR), "%s/voicemail/", ast_config_AST_SPOOL_DIR);
-
+
if (!(mwi_subscription_tps = ast_taskprocessor_get("app_voicemail", 0))) {
ast_log(AST_LOG_WARNING, "failed to reference mwi subscription taskprocessor. MWI will not work\n");
}
return AST_MODULE_LOAD_SUCCESS;
}
-static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context)
+static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context)
{
int cmd = 0;
char destination[80] = "";
ast_verb(3, "User hit '*' to cancel outgoing call\n");
return 0;
}
- if ((cmd = ast_readstring(chan, destination + strlen(destination), sizeof(destination) - 1, 6000, 10000, "#")) < 0)
+ if ((cmd = ast_readstring(chan, destination + strlen(destination), sizeof(destination) - 1, 6000, 10000, "#")) < 0)
retries++;
else
cmd = 't';
if (retries >= 3) {
return 0;
}
-
+
} else {
ast_verb(3, "Destination number is CID number '%s'\n", num);
ast_copy_string(destination, num, sizeof(destination));
if (!ast_strlen_zero(destination)) {
if (destination[strlen(destination) -1 ] == '*')
- return 0;
+ return 0;
ast_verb(3, "Placing outgoing call to extension '%s' in context '%s' from context '%s'\n", destination, outgoing_context, ast_channel_context(chan));
ast_channel_exten_set(chan, destination);
ast_channel_context_set(chan, outgoing_context);
/*!
* \brief The advanced options within a message.
* \param chan
- * \param vmu
+ * \param vmu
* \param vms
* \param msg
* \param option
* \param record_gain
*
- * Provides handling for the play message envelope, call the person back, or reply to message.
+ * Provides handling for the play message envelope, call the person back, or reply to message.
*
* \return zero on success, -1 on error.
*/
char *cid;
struct ast_flags config_flags = { CONFIG_FLAG_NOCACHE, };
- vms->starting = 0;
+ vms->starting = 0;
make_file(vms->fn, sizeof(vms->fn), vms->curdir, msg);
}
}
ast_test_suite_event_notify("USERPRESS", "Message: User pressed %c\r\nDTMF: %c", res, res);
- break;
-
+ break;
+
}
if (res == 't')
res = 0;
res = -1;
}
break;
-
+
case 1: /* Reply */
/* Send reply directly to sender */
if (ast_strlen_zero(cid))
snprintf(mailbox, sizeof(mailbox), "%s@%s", num, vmu->context);
ast_verb(3, "Leaving voicemail for '%s' in context '%s'\n", num, vmu->context);
-
+
memset(&leave_options, 0, sizeof(leave_options));
leave_options.record_gain = record_gain;
res = leave_voicemail(chan, mailbox, &leave_options);
ast_config_destroy(msg_cfg);
return res;
}
- }
+ }
res = 0;
break;
} else {
/* Otherwise 1 is to save the existing message */
ast_verb(3, "Saving message as is\n");
- if (!outsidecaller)
+ if (!outsidecaller)
ast_filerename(tempfile, recordfile, NULL);
if (!forwardintro) {
ast_stream_and_wait(chan, "vm-msgsaved", "");
case '3':
msg_exists = 0;
/* Record */
- if (recorded == 1)
+ if (recorded == 1)
ast_verb(3, "Re-recording the message\n");
- else
+ else
ast_verb(3, "Recording the message\n");
-
+
if (recorded && outsidecaller) {
if (forwardintro) {
cmd = ast_play_and_wait(chan, "vm-record-prepend");
if (!outsidecaller) {
/* user was recording a greeting and they hung up, so let's delete the recording. */
ast_filedelete(tempfile, NULL);
- }
+ }
return cmd;
}
if (cmd == '0') {
case '#':
cmd = ast_play_and_wait(chan, "vm-sorry");
break;
-#if 0
+#if 0
/* XXX Commented out for the moment because of the dangers of deleting
a message while recording (can put the message numbers out of sync) */
case '*':
if (!cmd)
cmd = ast_waitfordigit(chan, 600);
}
-
+
if (!cmd && outsidecaller && ast_test_flag(vmu, VM_OPERATOR)) {
cmd = ast_play_and_wait(chan, "vm-reachoper");
if (!cmd)
* \brief Wait for Ring Application
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Waits until first ring after time");
-
* \brief While Loop Implementation
*
* \author Anthony Minessale <anthmct@yahoo.com>
- *
+ *
* \ingroup applications
*/
for (x=0;;x++) {
if (get_index(chan, prefix, x)) {
used_index_i = x;
- } else
+ } else
break;
}
-
+
snprintf(used_index, VAR_SIZE, "%d", used_index_i);
snprintf(new_index, VAR_SIZE, "%d", used_index_i + 1);
-
+
if (!end)
condition = ast_strdupa(data);
my_name = ast_alloca(size);
memset(my_name, 0, size);
snprintf(my_name, size, "%s_%s_%d", ast_channel_context(chan), ast_channel_exten(chan), ast_channel_priority(chan));
-
+
ast_channel_lock(chan);
if (end) {
label = used_index;
snprintf(end_varname,VAR_SIZE,"END_%s",varname);
}
ast_channel_unlock(chan);
-
+
if ((!end && !pbx_checkcondition(condition)) || (end == 2)) {
/* Condition Met (clean up helper vars) */
static int unload_module(void)
{
int res;
-
+
res = ast_unregister_application(start_app);
res |= ast_unregister_application(stop_app);
res |= ast_unregister_application(exit_app);
* \brief Playback the special information tone to get rid of telemarketers
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
return res;
}
- if (!res)
+ if (!res)
res = ast_tonepair(chan, 950, 0, 330, 0);
- if (!res)
+ if (!res)
res = ast_tonepair(chan, 1400, 0, 330, 0);
- if (!res)
+ if (!res)
res = ast_tonepair(chan, 1800, 0, 330, 0);
- if (!res)
+ if (!res)
res = ast_tonepair(chan, 0, 0, 1000, 0);
-
+
pbx_builtin_setvar_helper(chan, "ZAPATELLERSTATUS", "ZAPPED");
return res;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Block Telemarketers with Special Information Tone");
-
*/
static unsigned char enter[] = {
-0xba, 0xba, 0xb0, 0xa6, 0xa9, 0xb8, 0xfe, 0x46, 0x42, 0x46,
-0x4a, 0xfe, 0xac, 0xa2, 0x9f, 0x9f, 0xa8, 0xb8, 0x3b, 0x29,
-0x35, 0x4a, 0xfe, 0xc1, 0xad, 0xa2, 0xad, 0xc5, 0x4e, 0x68,
-0x68, 0xe7, 0xb8, 0xb0, 0xb2, 0xc1, 0xc1, 0xb0, 0xae, 0xcd,
-0xfe, 0xfe, 0xcd, 0xcd, 0xfe, 0x68, 0xd3, 0xb2, 0xae, 0xab,
-0xb2, 0xfe, 0x35, 0x31, 0xdb, 0xac, 0xab, 0xaf, 0xab, 0xaa,
-0xb4, 0x68, 0x3b, 0x39, 0x3f, 0x68, 0xb4, 0xa8, 0xa8, 0xb0,
-0xbc, 0xbc, 0xc5, 0x3f, 0x31, 0x37, 0xfe, 0xc1, 0xbc, 0xb0,
-0xa5, 0xa2, 0xa8, 0xaf, 0xbe, 0x3b, 0x28, 0x26, 0x3d, 0xbc,
-0xb0, 0xae, 0xa2, 0x9f, 0xa2, 0xfe, 0x29, 0x24, 0x29, 0x4a,
-0xc5, 0xaa, 0xa8, 0xa9, 0xa8, 0xa5, 0xa7, 0xdb, 0x2c, 0x27,
-0x2d, 0x4a, 0xfe, 0xdb, 0xb2, 0xa2, 0x9f, 0x9f, 0xae, 0xe7,
-0x2c, 0x22, 0x2b, 0xfe, 0xba, 0xb0, 0xaa, 0x9f, 0xa3, 0xb0,
-0x5c, 0x33, 0x33, 0x39, 0x5c, 0xdb, 0xc1, 0xb4, 0xb0, 0xaa,
-0xad, 0xba, 0x54, 0x46, 0xfe, 0xe7, 0xfe, 0x54, 0xe7, 0xaf,
-0xa6, 0xa7, 0xb0, 0xfe, 0x46, 0x39, 0x5c, 0xe7, 0xdb, 0xfe,
-0xba, 0xac, 0xa8, 0xc5, 0x46, 0x33, 0x54, 0xc5, 0xae, 0xad,
-0xb2, 0xc1, 0xcd, 0xc1, 0xbc, 0xfe, 0x3f, 0x37, 0xfe, 0xb4,
-0xb6, 0xcd, 0xdb, 0xc1, 0xb0, 0xb6, 0xcd, 0x4e, 0x39, 0x37,
-0xfe, 0xb0, 0xab, 0xa9, 0xa9, 0xa9, 0xb0, 0x5c, 0x29, 0x25,
-0x31, 0xfe, 0xc1, 0xb4, 0xae, 0xab, 0xab, 0xb2, 0xcd, 0x3b,
-0x2a, 0x2c, 0x54, 0xb4, 0xb4, 0xba, 0xb2, 0xa3, 0x9f, 0xa8,
-0xfe, 0x33, 0x27, 0x2a, 0x39, 0xfe, 0xc1, 0xbe, 0xb0, 0xa2,
-0x9f, 0xb0, 0x33, 0x22, 0x25, 0x46, 0xc1, 0xb8, 0xb0, 0xab,
-0xa8, 0xa8, 0xb0, 0xbe, 0x42, 0x2c, 0x2e, 0x4a, 0xfe, 0x5c,
-0xfe, 0xb4, 0xa8, 0xa8, 0xba, 0xfe, 0x4a, 0x39, 0x39, 0x46,
-0xfe, 0xbc, 0xaf, 0xa5, 0xa5, 0xae, 0x68, 0x37, 0x4a, 0xfe,
-0xfe, 0x4a, 0x4a, 0xd3, 0xb0, 0xb0, 0xc1, 0x5c, 0x46, 0x46,
-0xd3, 0xb6, 0xbe, 0x54, 0x54, 0xc9, 0xab, 0xae, 0xc5, 0x46,
-0x4a, 0xfe, 0xcd, 0xc9, 0xcd, 0xe7, 0xe7, 0xc9, 0xb4, 0xc5,
-0x4a, 0x2c, 0x37, 0xc1, 0xb0, 0xb2, 0xb4, 0xb2, 0xb6, 0xdb,
-0xfe, 0x4a, 0x46, 0x3f, 0x68, 0xba, 0xb2, 0xba, 0xc5, 0xb6,
-0xb2, 0xcd, 0x33, 0x2e, 0x39, 0x68, 0xfe, 0xe7, 0xba, 0xaf,
-0xa7, 0xa7, 0xad, 0xe7, 0x2d, 0x25, 0x2f, 0xd3, 0xbe, 0xcd,
-0xc5, 0xac, 0xa6, 0xac, 0xfe, 0x3b, 0x2c, 0x2d, 0x3d, 0xc1,
-0xb4, 0xbe, 0xcd, 0xaf, 0xa5, 0xa8, 0xe7, 0x31, 0x2f, 0x39,
-0x46, 0x5c, 0xdb, 0xbc, 0xba, 0xaf, 0xa9, 0xad, 0xfe, 0x2f,
-0x2d, 0xba, 0xad, 0xba, 0xfe, 0x3d, 0x42, 0x5c, 0xc9, 0xc1,
-0xcd, 0xfe, 0xc1, 0xae, 0xa6, 0xcd, 0x33, 0x25, 0x3b, 0xdb,
-0xb0, 0xb6, 0xb8, 0xb6, 0xb4, 0xb8, 0xba, 0xfe, 0x3d, 0x37,
-0xfe, 0xba, 0xc1, 0x54, 0x54, 0xd3, 0xb0, 0xb4, 0xe7, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xd3, 0xb6, 0xa9, 0xa7, 0xba,
-0x3d, 0x35, 0xfe, 0xc1, 0xcd, 0x4a, 0x54, 0xbe, 0xb2, 0xb8,
-0xfe, 0x46, 0x3b, 0xfe, 0xba, 0xab, 0xc5, 0x46, 0x3b, 0xbc,
-0xaa, 0xab, 0xd3, 0x68, 0xfe, 0xd3, 0xcd, 0xdb, 0x54, 0x3d,
-0x4a, 0xbc, 0xac, 0xb4, 0x3f, 0x2e, 0x3d, 0xba, 0xb0, 0xb8,
-0xba, 0xb6, 0xba, 0xcd, 0xfe, 0xfe, 0x5c, 0x54, 0xc9, 0xb4,
-0xbe, 0x54, 0x54, 0xcd, 0xb6, 0xc9, 0x46, 0x54, 0xcd, 0xc5,
-0xdb, 0xfe, 0xfe, 0xc1, 0xae, 0xa9, 0xac, 0xfe, 0x35, 0x2e,
-0xfe, 0xba, 0xc1, 0x5c, 0xfe, 0xb6, 0xaa, 0xb0, 0xe7, 0x35,
-0x2e, 0x39, 0xc1, 0xac, 0xb0, 0xfe, 0xfe, 0xbc, 0xa6, 0xac,
-0xc1, 0x42, 0x46, 0x54, 0xfe, 0xfe, 0xfe, 0xfe, 0xc9, 0xae,
-0xa9, 0xb0, 0x54, 0x35, 0x37, 0xfe, 0xd3, 0xd3, 0xb8, 0xae,
-0xab, 0xb6, 0xe7, 0xfe, 0xfe, 0x68, 0xfe, 0xfe, 0xfe, 0x4e,
-0xfe, 0xb0, 0xac, 0xb8, 0xfe, 0xfe, 0xc1, 0xb6, 0xc5, 0x46,
-0x3d, 0xe7, 0xb4, 0xa7, 0xab, 0xbc, 0x3f, 0x37, 0x54, 0xba,
-0xcd, 0x54, 0x42, 0xc5, 0xae, 0xac, 0xc9, 0x46, 0x3d, 0x54,
-0xba, 0xb0, 0xb0, 0xfe, 0x5c, 0xcd, 0xb0, 0xb0, 0xc9, 0x54,
-0x54, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xcd, 0xc1, 0xba, 0xc5,
-0xfe, 0x42, 0x46, 0xfe, 0xc5, 0xba, 0xb2, 0xa7, 0xa7, 0xb0,
-0xfe, 0x3d, 0x4a, 0x5c, 0xfe, 0xfe, 0xfe, 0xe7, 0xbc, 0xb0,
-0xae, 0xc5, 0x4e, 0x39, 0xfe, 0xc5, 0xbe, 0xfe, 0x54, 0xc9,
-0xa9, 0xa2, 0xa5, 0xbc, 0x3b, 0x2f, 0x35, 0xfe, 0xc9, 0xfe,
-0xfe, 0xc5, 0xa9, 0xa6, 0xb0, 0x54, 0x31, 0x31, 0x3f, 0xd3,
-0xbc, 0xc1, 0xcd, 0xb8, 0xae, 0xa8, 0xb4, 0xd3, 0x54, 0x4e,
-0x5c, 0x54, 0xfe, 0xdb, 0xba, 0xb4, 0xb4, 0xba, 0xcd, 0x5c,
-0x3d, 0x3f, 0x54, 0xfe, 0xcd, 0xaf, 0xa8, 0xac, 0xc5, 0xfe,
-0xfe, 0xe7, 0xdb, 0xfe, 0xfe, 0xfe, 0xe7, 0xb8, 0xaf, 0xb0,
-0xe7, 0x42, 0x4a, 0xcd, 0xbc, 0xdb, 0x46, 0x68, 0xcd, 0xb0,
-0xab, 0xbc, 0xfe, 0x3d, 0x46, 0xfe, 0xb8, 0xbc, 0xd3, 0xd3,
-0xb6, 0xb0, 0xb6, 0x5c, 0x3b, 0x35, 0x54, 0xdb, 0xba, 0xb4,
-0xc1, 0xc9, 0xc1, 0xba, 0xc9, 0x5c, 0x3d, 0x46, 0xfe, 0xcd,
-0xc5, 0xb8, 0xae, 0xaf, 0xb4, 0xd3, 0x54, 0x3d, 0x35, 0x46,
-0xfe, 0xdb, 0xbc, 0xb2, 0xa9, 0xab, 0xba, 0x3f, 0x31, 0x39,
-0xfe, 0xe7, 0xdb, 0xcd, 0xb8, 0xae, 0xab, 0xac, 0xe7, 0x3d,
-0x2d, 0x3f, 0xfe, 0xdb, 0xfe, 0xfe, 0xbc, 0xaa, 0xa8, 0xb0,
-0xfe, 0x31, 0x2d, 0x3d, 0xdb, 0xc5, 0xcd, 0xc9, 0xb4, 0xa8,
-0xad, 0xc5, 0x46, 0x39, 0x3f, 0x5c, 0xfe, 0xd3, 0xc5, 0xc1,
-0xb6, 0xb0, 0xbc, 0x68, 0x46, 0x4e, 0xe7, 0xfe, 0x5c, 0xfe,
-0xc1, 0xaf, 0xb0, 0xb8, 0xe7, 0x5c, 0x5c, 0xfe, 0xe7, 0xfe,
-0xfe, 0xe7, 0xb0, 0xab, 0xb2, 0x4a, 0x37, 0x3f, 0xcd, 0xbe,
-0xc1, 0xe7, 0xe7, 0xd3, 0xb6, 0xb4, 0xc9, 0x3b, 0x33, 0x4a,
-0xba, 0xb4, 0xc5, 0xfe, 0xc9, 0xb6, 0xb4, 0xcd, 0xfe, 0x3b,
-0x3b, 0xfe, 0xc1, 0xb6, 0xc5, 0xc5, 0xb8, 0xb0, 0xba, 0x4a,
-0x31, 0x35, 0x68, 0xcd, 0xc5, 0xba, 0xb4, 0xb0, 0xb0, 0xba,
-0x5c, 0x35, 0x2f, 0x4e, 0xd3, 0xc1, 0xdb, 0xd3, 0xb4, 0xa9,
-0xab, 0xcd, 0x3b, 0x2f, 0x35, 0xfe, 0xd3, 0xd3, 0xdb, 0xbc,
-0xad, 0xa4, 0xb0, 0xfe, 0x2d, 0x2f, 0x3f, 0xe7, 0xe7, 0xe7,
-0xcd, 0xb4, 0xaf, 0xad, 0xc5, 0x3d, 0x31, 0x3d, 0xe7, 0xd3,
-0xe7, 0xe7, 0xc1, 0xaf, 0xad, 0xb6, 0xfe, 0x4a, 0x42, 0x54,
-0xfe, 0x68, 0xfe, 0xd3, 0xb2, 0xae, 0xb4, 0xfe, 0x42, 0x4e,
-0xcd, 0xc5, 0xcd, 0xdb, 0xc9, 0xb4, 0xb0, 0xb6, 0xfe, 0x3b,
-0x42, 0xe7, 0xb0, 0xb8, 0xcd, 0xfe, 0xc9, 0xb6, 0xb8, 0xfe,
-0x42, 0x3d, 0xfe, 0xc1, 0xb0, 0xba, 0xd3, 0xfe, 0xc1, 0xb0,
-0xb6, 0xfe, 0x3b, 0x3f, 0xe7, 0xba, 0xb8, 0xbc, 0xc5, 0xc1,
-0xc1, 0xcd, 0xfe, 0x3b, 0x37, 0xfe, 0xc1, 0xb4, 0xb6, 0xb8,
-0xb6, 0xb8, 0xc5, 0x5c, 0x3f, 0x46, 0xfe, 0xcd, 0xc5, 0xcd,
-0xcd, 0xc1, 0xb2, 0xb2, 0xfe, 0x3f, 0x35, 0x54, 0xdb, 0xc1,
-0xcd, 0xcd, 0xbc, 0xaf, 0xac, 0xb6, 0x54, 0x35, 0x31, 0x68,
-0xba, 0xb8, 0xcd, 0xdb, 0xc9, 0xb2, 0xb4, 0xc9, 0x46, 0x39,
-0x42, 0xdb, 0xbc, 0xbc, 0xcd, 0xcd, 0xbe, 0xb2, 0xb8, 0xe7,
-0x54, 0x46, 0xfe, 0xfe, 0xdb, 0xc9, 0xc5, 0xbe, 0xbe, 0xc9,
-0xfe, 0x5c, 0x5c, 0xfe, 0xd3, 0xcd, 0xcd, 0xc5, 0xb6, 0xb2,
-0xc5, 0x68, 0x4e, 0xfe, 0xc5, 0xc1, 0xcd, 0x68, 0x5c, 0xe7,
-0xb8, 0xb6, 0xd3, 0x4a, 0x46, 0xfe, 0xbc, 0xb8, 0xc1, 0xe7,
-0xe7, 0xc1, 0xb4, 0xbe, 0xfe, 0x3f, 0x3f, 0xfe, 0xba, 0xb2,
-0xba, 0xe7, 0xfe, 0xcd, 0xcd, 0xfe, 0x4e, 0x46, 0xfe, 0xc5,
-0xb8, 0xb2, 0xba, 0xc1, 0xcd, 0xd3, 0xe7, 0xfe, 0x5c, 0x5c,
-0xfe, 0xe7, 0xc5, 0xbe, 0xb6, 0xba, 0xc5, 0xfe, 0x3f, 0x3f,
-0x54, 0xfe, 0xd3, 0xc1, 0xbc, 0xb6, 0xb0, 0xb0, 0xd3, 0x54,
-0x39, 0x46, 0xfe, 0xc1, 0xcd, 0xe7, 0xe7, 0xc5, 0xb8, 0xb4,
-0xd3, 0x54, 0x37, 0x42, 0xdb, 0xbe, 0xc1, 0xd3, 0xcd, 0xb8,
-0xb0, 0xb0, 0xcd, 0x4a, 0x3b, 0x42, 0xe7, 0xc5, 0xbe, 0xcd,
-0xe7, 0xd3, 0xc5, 0xcd, 0xfe, 0x54, 0x54, 0x68, 0xe7, 0xc5,
-0xc1, 0xc1, 0xcd, 0xcd, 0xc9, 0xc9, 0xcd, 0xe7, 0xfe, 0xfe,
-0xfe, 0xe7, 0xc5, 0xbe, 0xc1, 0xfe, 0x5c, 0x5c, 0xfe, 0xcd,
-0xcd, 0xcd, 0xdb, 0xd3, 0xc1, 0xbc, 0xbe, 0xfe, 0x4e, 0x54,
-0xcd, 0xb6, 0xb8, 0xd3, 0x5c, 0x5c, 0xfe, 0xc5, 0xc9, 0xfe,
-0x46, 0x4a, 0xe7, 0xb4, 0xb6, 0xc5, 0xfe, 0xe7, 0xcd, 0xc9,
-0xdb, 0xfe, 0x4e, 0x68, 0xd3, 0xb6, 0xb2, 0xbc, 0xfe, 0x68,
-0xfe, 0xfe, 0x68, 0x54, 0x68, 0xe7, 0xc5, 0xbc, 0xb8, 0xbe,
-0xcd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xd3, 0xd3, 0xcd,
-0xc1, 0xb8, 0xbc, 0xdb, 0x4e, 0x42, 0x4a, 0xfe, 0xc9, 0xc1,
-0xcd, 0xd3, 0xcd, 0xba, 0xb8, 0xcd, 0x46, 0x3b, 0xfe, 0xc9,
-0xba, 0xcd, 0xe7, 0xfe, 0xd3, 0xc1, 0xba, 0xdb, 0x54, 0x3d,
-0x68, 0xd3, 0xbc, 0xcd, 0xfe, 0xfe, 0xc5, 0xbe, 0xc1, 0xe7,
-0x54, 0x4a, 0xfe, 0xc9, 0xc1, 0xcd, 0xfe, 0xfe, 0xd3, 0xd3,
-0xd3, 0xfe, 0xe7, 0xe7, 0xe7, 0xdb, 0xd3, 0xe7, 0xe7, 0xe7,
-0xfe, 0xfe, 0xfe, 0xfe, 0xcd, 0xc9, 0xdb, 0xfe, 0xfe, 0xdb,
-0xbe, 0xc9, 0xfe, 0x5c, 0xfe, 0xc9, 0xbc, 0xbe, 0xdb, 0x68,
-0x5c, 0xdb, 0xc5, 0xd3, 0x54, 0x46, 0xfe, 0xbc, 0xb2, 0xb8,
-0xdb, 0x68, 0x68, 0xe7, 0xcd, 0xdb, 0x5c, 0x54, 0xfe, 0xc1,
-0xb8, 0xc1, 0xe7, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe,
-0xd3, 0xc5, 0xc1, 0xc5, 0xcd, 0xd3, 0xe7, 0xfe, 0x54, 0x4e,
-0xfe, 0xd3, 0xcd, 0xd3, 0xd3, 0xc5, 0xc1, 0xc1, 0xe7, 0x5c,
-0x4e, 0x5c, 0xd3, 0xc1, 0xcd, 0xfe, 0xfe, 0xcd, 0xba, 0xba,
-0xe7, 0x4a, 0x4a, 0x68, 0xcd, 0xc5, 0xcd, 0xfe, 0xfe, 0xcd,
-0xb8, 0xc1, 0xe7, 0x4e, 0x5c, 0xe7, 0xc1, 0xc9, 0xdb, 0xfe,
-0xe7, 0xc9, 0xc5, 0xd3, 0xfe, 0x68, 0xfe, 0xdb, 0xd3, 0xe7,
-0xfe, 0xfe, 0xcd, 0xc9, 0xcd, 0xd3, 0xd3, 0xd3, 0xcd, 0xe7,
-0xfe, 0xfe, 0xe7, 0xc5, 0xc5, 0xe7, 0x68, 0x68, 0xe7, 0xc1,
-0xc5, 0xfe, 0x5c, 0xfe, 0xd3, 0xc1, 0xd3, 0xfe, 0x68, 0xe7,
-0xc5, 0xb6, 0xc5, 0xe7, 0x68, 0xfe, 0xcd, 0xc5, 0xe7, 0xfe,
-0x54, 0xfe, 0xc9, 0xc5, 0xdb, 0xfe, 0xfe, 0xfe, 0xd3, 0xd3,
-0xfe, 0xfe, 0xfe, 0xcd, 0xc1, 0xc1, 0xc9, 0xd3, 0xd3, 0xe7,
-0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xd3, 0xdb, 0xe7, 0xe7, 0xd3,
-0xcd, 0xd3, 0xfe, 0xfe, 0xfe, 0xcd, 0xc5, 0xd3, 0xe7, 0xe7,
-0xc9, 0xbc, 0xbe, 0xe7, 0x68, 0x4a, 0xfe, 0xdb, 0xcd, 0xfe,
-0xfe, 0xfe, 0xcd, 0xc1, 0xc9, 0xfe, 0x54, 0x5c, 0xe7, 0xc9,
-0xc5, 0xe7, 0xfe, 0xfe, 0xcd, 0xc5, 0xc5, 0xe7, 0xfe, 0xfe,
-0xfe, 0xe7, 0xe7, 0xfe, 0xfe, 0xdb, 0xd3, 0xd3, 0xdb, 0xe7,
-0xfe, 0xfe, 0xe7, 0xe7, 0xdb, 0xd3, 0xc9, 0xd3, 0xe7, 0xfe,
-0xfe, 0xd3, 0xd3, 0xdb, 0xfe, 0xfe, 0xfe, 0xd3, 0xcd, 0xcd,
-0xfe, 0xfe, 0xe7, 0xc9, 0xc5, 0xd3, 0xfe, 0xfe, 0xfe, 0xcd,
-0xc9, 0xd3, 0xfe, 0xfe, 0xfe, 0xdb, 0xc9, 0xcd, 0xe7, 0xfe,
-0xe7, 0xcd, 0xcd, 0xe7, 0xfe, 0xfe, 0xe7, 0xd3, 0xc5, 0xcd,
-0xe7, 0xfe, 0xfe, 0xfe, 0xdb, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe,
-0xe7, 0xcd, 0xcd, 0xd3, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe,
-0xe7, 0xe7, 0xdb, 0xc9, 0xc1, 0xc5, 0xfe, 0x5c, 0x68, 0xfe,
-0xd3, 0xdb, 0xe7, 0xe7, 0xe7, 0xd3, 0xc5, 0xcd, 0xe7, 0x68,
-0xfe, 0xe7, 0xcd, 0xd3, 0xe7, 0xfe, 0xe7, 0xcd, 0xc1, 0xc1,
-0xdb, 0xfe, 0x54, 0xfe, 0xe7, 0xcd, 0xe7, 0xfe, 0xe7, 0xd3,
-0xcd, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xcd, 0xc5, 0xcd, 0xfe,
-0xfe, 0xe7, 0xcd, 0xd3, 0xdb, 0xe7, 0xfe, 0xfe, 0xfe, 0xe7,
-0xd3, 0xd3, 0xe7, 0xfe, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe,
-0xfe, 0xdb, 0xc5, 0xc1, 0xd3, 0xfe, 0xfe, 0xfe, 0xd3, 0xc9,
-0xcd, 0xe7, 0xfe, 0xfe, 0xd3, 0xcd, 0xdb, 0xfe, 0x5c, 0xfe,
-0xcd, 0xc9, 0xd3, 0xfe, 0xfe, 0xfe, 0xd3, 0xc9, 0xcd, 0xfe,
-0x68, 0xfe, 0xd3, 0xc1, 0xc1, 0xdb, 0xfe, 0xfe, 0xe7, 0xe7,
-0xfe, 0xfe, 0x68, 0xfe, 0xe7, 0xc5, 0xc9, 0xdb, 0xfe, 0xfe,
-0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xdb, 0xc5, 0xc5,
-0xd3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xfe,
-0xc9, 0xc1, 0xc5, 0xfe, 0x54, 0x5c, 0xfe, 0xcd, 0xc5, 0xcd,
-0xfe, 0xfe, 0xdb, 0xc5, 0xc9, 0xfe, 0x5c, 0x68, 0xfe, 0xcd,
-0xcd, 0xfe, 0xfe, 0xfe, 0xe7, 0xc5, 0xc1, 0xd3, 0xfe, 0xfe,
-0xdb, 0xc9, 0xc5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe,
-0xfe, 0xfe, 0xe7, 0xcd, 0xcd, 0xdb, 0xfe, 0xfe, 0xfe, 0xfe,
-0xe7, 0xd3, 0xcd, 0xd3, 0xfe, 0xfe, 0xdb, 0xcd, 0xd3, 0xe7,
-0xfe, 0xfe, 0xfe, 0xdb, 0xcd, 0xd3, 0xe7, 0xfe, 0xd3, 0xc5,
-0xc9, 0xfe, 0x5c, 0x54, 0xfe, 0xcd, 0xc1, 0xcd, 0xe7, 0xfe,
-0xfe, 0xd3, 0xcd, 0xfe, 0x54, 0x5c, 0xe7, 0xc1, 0xc1, 0xd3,
-0xfe, 0xfe, 0xe7, 0xd3, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xcd,
-0xc5, 0xcd, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xe7, 0xd3, 0xcd, 0xc9, 0xcd, 0xe7, 0xfe, 0xfe, 0xfe, 0xdb,
-0xc9, 0xcd, 0xe7, 0xfe, 0xe7, 0xc9, 0xc5, 0xdb, 0xfe, 0x5c,
-0xfe, 0xe7, 0xcd, 0xcd, 0xe7, 0xfe, 0xe7, 0xc5, 0xc1, 0xd3,
-0xfe, 0x5c, 0xfe, 0xcd, 0xc5, 0xcd, 0xe7, 0xfe, 0xfe, 0xe7,
-0xd3, 0xe7, 0xfe, 0xfe, 0xe7, 0xcd, 0xcd, 0xdb, 0xfe, 0xfe,
-0xfe, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xe7, 0xdb, 0xcd, 0xd3,
-0xd3, 0xdb, 0xfe, 0xfe, 0xfe, 0xfe, 0xdb, 0xd3, 0xdb, 0xe7,
-0xe7, 0xdb, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xe7, 0xc9, 0xc5,
-0xcd, 0xe7, 0xfe, 0xdb, 0xd3, 0xe7, 0xfe, 0x68, 0xfe, 0xe7,
-0xcd, 0xcd, 0xd3, 0xfe, 0xfe, 0xe7, 0xdb, 0xe7, 0xfe, 0x68,
-0xfe, 0xdb, 0xfe, 0x68, 0xbe, 0xb2, 0xae, 0xab, 0xb2, 0xfe,
-0x2f, 0x31, 0xdb, 0xac, 0xad, 0xaf, 0xab, 0xab, 0xb4, 0x68,
-0x37, 0x39, 0x3f, 0xe7, 0xb4, 0xa8, 0xaa, 0xb0, 0xbc, 0xbc,
-0xc5, 0x3f, 0x31, 0x3d, 0xfe, 0xc1, 0xb8, 0xb0, 0xa5, 0xa2,
-0xa8, 0xaf, 0xdb, 0x3b, 0x28, 0x2a, 0x3d, 0xbc, 0xb0, 0xaa,
-0xa2, 0x9f, 0xab, 0xfe, 0x29, 0x24, 0x29, 0x4a, 0xb4, 0xaa,
-0xa8, 0xa9, 0xa8, 0xa5, 0xac, 0xdb, 0x2c, 0x27, 0x35, 0x4a,
-0xfe, 0xcd, 0xb2, 0xa2, 0x9f, 0x9f, 0xae, 0x4e, 0x2c, 0x22,
-0x33, 0xfe, 0xba, 0xb0, 0xa6, 0x9f, 0xa3, 0xbc, 0x5c, 0x33,
-0x31, 0x39, 0x5c, 0xcd, 0xc1, 0xb4, 0xad, 0xaa, 0xad, 0xcd,
-0x54, 0x46, 0xfe, 0xe7, 0xfe, 0x54, 0xc5, 0xaf, 0xa6, 0xa9,
-0xb0, 0xfe, 0x3d, 0x39, 0x5c, 0xdb, 0xdb, 0xfe, 0xba, 0xac,
-0xa8, 0xc5, 0x39, 0x33, 0x54, 0xb8, 0xae, 0xad, 0xb8, 0xc1,
-0xcd, 0xbe, 0xbc, 0xfe, 0x39, 0x37, 0xfe, 0xb4, 0xba, 0xcd,
-0xdb, 0xb8, 0xb0, 0xb6, 0xfe, 0x4e, 0x39, 0x3d, 0xfe, 0xb0,
-0xaa, 0xa9, 0xa9, 0xaa, 0xb0, 0x5c, 0x29, 0x28, 0x31, 0xfe,
-0xba, 0xb4, 0xae, 0xab, 0xab, 0xb2, 0xfe, 0x3b, 0x2a, 0x2f,
-0x54, 0xb4, 0xb4, 0xba, 0xb2, 0xa3, 0x9f, 0xa8, 0xfe, 0x2c,
-0x27, 0x2a, 0x46, 0xfe, 0xc1, 0xbc, 0xb0, 0xa2, 0xa2, 0xb0,
-0x33, 0x22, 0x2b, 0x46, 0xc1, 0xb4, 0xb0, 0xab, 0xa8, 0xa8,
-0xb0, 0xdb, 0x42, 0x2c, 0x33, 0x4a, 0xfe, 0x5c, 0xdb, 0xb4,
-0xa8, 0xad, 0xba, 0xfe, 0x46, 0x39, 0x39, 0x4a, 0xfe, 0xbc,
-0xab, 0xa5, 0xa5, 0xb8, 0x68, 0x37, 0x4a, 0xe7, 0xfe, 0x4a,
-0x5c, 0xd3, 0xb0, 0xb2, 0xc1, 0x5c, 0x42, 0x46, 0xd3, 0xb4,
-0xbe, 0x54, 0x54, 0xb6, 0xab, 0xae, 0xe7, 0x46, 0x4a, 0xfe,
-0xcd, 0xc9, 0xd3, 0xe7, 0xe7, 0xbe, 0xb4, 0xc5, 0x37, 0x2c,
-0x37, 0xc1, 0xb0, 0xb2, 0xb4, 0xb2, 0xb6, 0xdb, 0x54, 0x4a,
-0x46, 0x42, 0x68, 0xba, 0xb2, 0xba, 0xc5, 0xb6, 0xb6, 0xcd,
-0x33, 0x2f, 0x39, 0x68, 0xfe, 0xe7, 0xba, 0xac, 0xa7, 0xa7,
-0xb2, 0xe7, 0x2d, 0x25, 0x2f, 0xd3, 0xbe, 0xd3, 0xc5, 0xac,
-0xa6, 0xac, 0xfe, 0x33, 0x2c, 0x2d, 0x54, 0xc1, 0xb4, 0xcd,
-0xcd, 0xaf, 0xa4, 0xa8, 0xe7, 0x31, 0x31, 0x39, 0x46, 0xfe,
-0xdb, 0xbc, 0xb6, 0xaf, 0xa9, 0xb2, 0xfe, 0x2f, 0xfe, 0xba,
-0xad, 0xba, 0x4e, 0x3d, 0x42, 0xfe, 0xc9, 0xc1, 0xe7, 0xfe,
-0xc1, 0xa9, 0xa6, 0xcd, 0x2a, 0x25, 0x3b, 0xbc, 0xb0, 0xb6,
-0xb8, 0xb4, 0xb4, 0xb8, 0xc1, 0xfe, 0x3d, 0x3d, 0xfe, 0xba,
-0xd3, 0x54, 0x54, 0xbe, 0xb0, 0xb4, 0xe7, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xc5, 0xb6, 0xa9, 0xaa, 0xba, 0x3d, 0x39,
-0xfe, 0xc1, 0xfe, 0x4a, 0x54, 0xbe, 0xb2, 0xb8, 0xfe, 0x3d,
-0x3b, 0xfe, 0xb0, 0xab, 0xc5, 0x39, 0x3b, 0xbc, 0xa7, 0xab,
-0xd3, 0x68, 0xfe, 0xd3, 0xcd, 0xfe, 0x54, 0x3d, 0xfe, 0xbc,
-0xac, 0xc9, 0x3f, 0x2e, 0xfe, 0xba, 0xb0, 0xba, 0xba, 0xb6,
-0xba, 0xd3, 0xfe, 0xfe, 0x5c, 0x54, 0xc9, 0xb4, 0xbe, 0x54,
-0x68, 0xcd, 0xb6, 0xfe, 0x46, 0x54, 0xcd, 0xc5, 0xdb, 0xfe,
-0xe7, 0xc1, 0xae, 0xa8, 0xac, 0xfe, 0x2e, 0x2e, 0xfe, 0xb6,
-0xc1, 0x5c, 0xe7, 0xb6, 0xaa, 0xb0, 0x54, 0x35, 0x2e, 0x4a,
-0xc1, 0xac, 0xbc, 0xfe, 0xfe, 0xaf, 0xa6, 0xac, 0xfe, 0x42,
-0x46, 0x5c, 0xfe, 0xfe, 0xfe, 0xe7, 0xc9, 0xae, 0xa9, 0xb0,
-0x54, 0x31, 0x37, 0xfe, 0xd3, 0xd3, 0xb8, 0xac, 0xab, 0xb6,
-0xe7, 0xfe, 0xfe, 0x68, 0xfe, 0xfe, 0xfe, 0x54, 0xfe, 0xb0,
-0xae, 0xb8, 0xfe, 0xe7, 0xc1, 0xb6, 0xe7, 0x46, 0x3d, 0xe7,
-0xae, 0xa7, 0xab, 0xdb, 0x3f, 0x37, 0xfe, 0xba, 0xcd, 0x3f,
-0x42, 0xc5, 0xab, 0xac, 0xc9, 0x46, 0x3d, 0x54, 0xba, 0xad,
-0xb0, 0xfe, 0x68, 0xcd, 0xb0, 0xb0, 0xc9, 0x54, 0x54, 0xfe,
-0xfe, 0xfe, 0xfe, 0xe7, 0xcd, 0xbe, 0xba, 0xc5, 0x68, 0x42,
-0x46, 0xe7, 0xc5, 0xba, 0xaf, 0xa7, 0xa7, 0xbc, 0xfe, 0x3d,
-0x4a, 0x68, 0xfe, 0xfe, 0xfe, 0xe7, 0xbc, 0xaf, 0xae, 0xc5,
-0x3d, 0x39, 0xfe, 0xbc, 0xbe, 0xfe, 0x68, 0xc9, 0xa9, 0xa2,
-0xaa, 0xbc, 0x3b, 0x2d, 0x35, 0xfe, 0xcd, 0xfe, 0xfe, 0xb4,
-0xa9, 0xa6, 0xbc, 0x54, 0x31, 0x31, 0x54, 0xd3, 0xbc, 0xc5,
-0xcd, 0xb8, 0xab, 0xa8, 0xb4, 0xfe, 0x54, 0x4e, 0x68, 0x54,
-0xfe, 0xc9, 0xba, 0xb4, 0xb4, 0xba, 0xcd, 0x5c, 0x3b, 0x3f,
-0x54, 0xfe, 0xcd, 0xaf, 0xa8, 0xac, 0xc5, 0x68, 0xfe, 0xe7,
-0xdb, 0xfe, 0xfe, 0xfe, 0xcd, 0xb8, 0xaf, 0xb6, 0xe7, 0x42,
-0x5c, 0xcd, 0xbc, 0xfe, 0x46, 0x68, 0xba, 0xb0, 0xab, 0xbc,
-0x54, 0x3d, 0x46, 0xc9, 0xb8, 0xbc, 0xdb, 0xd3, 0xb6, 0xb0,
-0xb6, 0x5c, 0x37, 0x35, 0x54, 0xc9, 0xba, 0xb4, 0xc1, 0xc9,
-0xc1, 0xba, 0xe7, 0x5c, 0x3d, 0x54, 0xfe, 0xcd, 0xc5, 0xb8,
-0xae, 0xaf, 0xb4, 0xd3, 0x54, 0x3b, 0x35, 0x46, 0xfe, 0xdb,
-0xbc, 0xaf, 0xa9, 0xab, 0xd3, 0x3f, 0x31, 0x3f, 0xfe, 0xe7,
-0xdb, 0xcd, 0xb8, 0xae, 0xaa, 0xac, 0xe7, 0x33, 0x2d, 0x3f,
-0xd3, 0xdb, 0xfe, 0xfe, 0xbc, 0xaa, 0xa9, 0xb0, 0xfe, 0x31,
-0x2f, 0x3d, 0xdb, 0xc5, 0xcd, 0xc9, 0xae, 0xa8, 0xad, 0xfe,
-0x46, 0x39, 0x46, 0x5c, 0xfe, 0xcd, 0xc5, 0xc1, 0xb6, 0xb0,
-0xbc, 0x68, 0x42, 0x4e, 0xe7, 0xfe, 0x5c, 0xfe, 0xb6, 0xaf,
-0xb0, 0xc5, 0xe7, 0x5c, 0x5c, 0xfe, 0xe7, 0xfe, 0x68, 0xe7,
-0xb0, 0xac, 0xb2, 0x4a, 0x35, 0x3f, 0xcd, 0xbc, 0xc1, 0xe7,
-0xe7, 0xd3, 0xb6, 0xb4, 0xfe, 0x3b, 0x33, 0xfe, 0xba, 0xb4,
-0xd3, 0xfe, 0xc9, 0xb4, 0xb4, 0xcd, 0x4a, 0x3b, 0x3b, 0xfe,
-0xb8, 0xb6, 0xc5, 0xc5, 0xb8, 0xb0, 0xcd, 0x4a, 0x31, 0x3b,
-0x68, 0xcd, 0xc1, 0xba, 0xb4, 0xb0, 0xb0, 0xba, 0x5c, 0x2f,
+0xba, 0xba, 0xb0, 0xa6, 0xa9, 0xb8, 0xfe, 0x46, 0x42, 0x46,
+0x4a, 0xfe, 0xac, 0xa2, 0x9f, 0x9f, 0xa8, 0xb8, 0x3b, 0x29,
+0x35, 0x4a, 0xfe, 0xc1, 0xad, 0xa2, 0xad, 0xc5, 0x4e, 0x68,
+0x68, 0xe7, 0xb8, 0xb0, 0xb2, 0xc1, 0xc1, 0xb0, 0xae, 0xcd,
+0xfe, 0xfe, 0xcd, 0xcd, 0xfe, 0x68, 0xd3, 0xb2, 0xae, 0xab,
+0xb2, 0xfe, 0x35, 0x31, 0xdb, 0xac, 0xab, 0xaf, 0xab, 0xaa,
+0xb4, 0x68, 0x3b, 0x39, 0x3f, 0x68, 0xb4, 0xa8, 0xa8, 0xb0,
+0xbc, 0xbc, 0xc5, 0x3f, 0x31, 0x37, 0xfe, 0xc1, 0xbc, 0xb0,
+0xa5, 0xa2, 0xa8, 0xaf, 0xbe, 0x3b, 0x28, 0x26, 0x3d, 0xbc,
+0xb0, 0xae, 0xa2, 0x9f, 0xa2, 0xfe, 0x29, 0x24, 0x29, 0x4a,
+0xc5, 0xaa, 0xa8, 0xa9, 0xa8, 0xa5, 0xa7, 0xdb, 0x2c, 0x27,
+0x2d, 0x4a, 0xfe, 0xdb, 0xb2, 0xa2, 0x9f, 0x9f, 0xae, 0xe7,
+0x2c, 0x22, 0x2b, 0xfe, 0xba, 0xb0, 0xaa, 0x9f, 0xa3, 0xb0,
+0x5c, 0x33, 0x33, 0x39, 0x5c, 0xdb, 0xc1, 0xb4, 0xb0, 0xaa,
+0xad, 0xba, 0x54, 0x46, 0xfe, 0xe7, 0xfe, 0x54, 0xe7, 0xaf,
+0xa6, 0xa7, 0xb0, 0xfe, 0x46, 0x39, 0x5c, 0xe7, 0xdb, 0xfe,
+0xba, 0xac, 0xa8, 0xc5, 0x46, 0x33, 0x54, 0xc5, 0xae, 0xad,
+0xb2, 0xc1, 0xcd, 0xc1, 0xbc, 0xfe, 0x3f, 0x37, 0xfe, 0xb4,
+0xb6, 0xcd, 0xdb, 0xc1, 0xb0, 0xb6, 0xcd, 0x4e, 0x39, 0x37,
+0xfe, 0xb0, 0xab, 0xa9, 0xa9, 0xa9, 0xb0, 0x5c, 0x29, 0x25,
+0x31, 0xfe, 0xc1, 0xb4, 0xae, 0xab, 0xab, 0xb2, 0xcd, 0x3b,
+0x2a, 0x2c, 0x54, 0xb4, 0xb4, 0xba, 0xb2, 0xa3, 0x9f, 0xa8,
+0xfe, 0x33, 0x27, 0x2a, 0x39, 0xfe, 0xc1, 0xbe, 0xb0, 0xa2,
+0x9f, 0xb0, 0x33, 0x22, 0x25, 0x46, 0xc1, 0xb8, 0xb0, 0xab,
+0xa8, 0xa8, 0xb0, 0xbe, 0x42, 0x2c, 0x2e, 0x4a, 0xfe, 0x5c,
+0xfe, 0xb4, 0xa8, 0xa8, 0xba, 0xfe, 0x4a, 0x39, 0x39, 0x46,
+0xfe, 0xbc, 0xaf, 0xa5, 0xa5, 0xae, 0x68, 0x37, 0x4a, 0xfe,
+0xfe, 0x4a, 0x4a, 0xd3, 0xb0, 0xb0, 0xc1, 0x5c, 0x46, 0x46,
+0xd3, 0xb6, 0xbe, 0x54, 0x54, 0xc9, 0xab, 0xae, 0xc5, 0x46,
+0x4a, 0xfe, 0xcd, 0xc9, 0xcd, 0xe7, 0xe7, 0xc9, 0xb4, 0xc5,
+0x4a, 0x2c, 0x37, 0xc1, 0xb0, 0xb2, 0xb4, 0xb2, 0xb6, 0xdb,
+0xfe, 0x4a, 0x46, 0x3f, 0x68, 0xba, 0xb2, 0xba, 0xc5, 0xb6,
+0xb2, 0xcd, 0x33, 0x2e, 0x39, 0x68, 0xfe, 0xe7, 0xba, 0xaf,
+0xa7, 0xa7, 0xad, 0xe7, 0x2d, 0x25, 0x2f, 0xd3, 0xbe, 0xcd,
+0xc5, 0xac, 0xa6, 0xac, 0xfe, 0x3b, 0x2c, 0x2d, 0x3d, 0xc1,
+0xb4, 0xbe, 0xcd, 0xaf, 0xa5, 0xa8, 0xe7, 0x31, 0x2f, 0x39,
+0x46, 0x5c, 0xdb, 0xbc, 0xba, 0xaf, 0xa9, 0xad, 0xfe, 0x2f,
+0x2d, 0xba, 0xad, 0xba, 0xfe, 0x3d, 0x42, 0x5c, 0xc9, 0xc1,
+0xcd, 0xfe, 0xc1, 0xae, 0xa6, 0xcd, 0x33, 0x25, 0x3b, 0xdb,
+0xb0, 0xb6, 0xb8, 0xb6, 0xb4, 0xb8, 0xba, 0xfe, 0x3d, 0x37,
+0xfe, 0xba, 0xc1, 0x54, 0x54, 0xd3, 0xb0, 0xb4, 0xe7, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xd3, 0xb6, 0xa9, 0xa7, 0xba,
+0x3d, 0x35, 0xfe, 0xc1, 0xcd, 0x4a, 0x54, 0xbe, 0xb2, 0xb8,
+0xfe, 0x46, 0x3b, 0xfe, 0xba, 0xab, 0xc5, 0x46, 0x3b, 0xbc,
+0xaa, 0xab, 0xd3, 0x68, 0xfe, 0xd3, 0xcd, 0xdb, 0x54, 0x3d,
+0x4a, 0xbc, 0xac, 0xb4, 0x3f, 0x2e, 0x3d, 0xba, 0xb0, 0xb8,
+0xba, 0xb6, 0xba, 0xcd, 0xfe, 0xfe, 0x5c, 0x54, 0xc9, 0xb4,
+0xbe, 0x54, 0x54, 0xcd, 0xb6, 0xc9, 0x46, 0x54, 0xcd, 0xc5,
+0xdb, 0xfe, 0xfe, 0xc1, 0xae, 0xa9, 0xac, 0xfe, 0x35, 0x2e,
+0xfe, 0xba, 0xc1, 0x5c, 0xfe, 0xb6, 0xaa, 0xb0, 0xe7, 0x35,
+0x2e, 0x39, 0xc1, 0xac, 0xb0, 0xfe, 0xfe, 0xbc, 0xa6, 0xac,
+0xc1, 0x42, 0x46, 0x54, 0xfe, 0xfe, 0xfe, 0xfe, 0xc9, 0xae,
+0xa9, 0xb0, 0x54, 0x35, 0x37, 0xfe, 0xd3, 0xd3, 0xb8, 0xae,
+0xab, 0xb6, 0xe7, 0xfe, 0xfe, 0x68, 0xfe, 0xfe, 0xfe, 0x4e,
+0xfe, 0xb0, 0xac, 0xb8, 0xfe, 0xfe, 0xc1, 0xb6, 0xc5, 0x46,
+0x3d, 0xe7, 0xb4, 0xa7, 0xab, 0xbc, 0x3f, 0x37, 0x54, 0xba,
+0xcd, 0x54, 0x42, 0xc5, 0xae, 0xac, 0xc9, 0x46, 0x3d, 0x54,
+0xba, 0xb0, 0xb0, 0xfe, 0x5c, 0xcd, 0xb0, 0xb0, 0xc9, 0x54,
+0x54, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xcd, 0xc1, 0xba, 0xc5,
+0xfe, 0x42, 0x46, 0xfe, 0xc5, 0xba, 0xb2, 0xa7, 0xa7, 0xb0,
+0xfe, 0x3d, 0x4a, 0x5c, 0xfe, 0xfe, 0xfe, 0xe7, 0xbc, 0xb0,
+0xae, 0xc5, 0x4e, 0x39, 0xfe, 0xc5, 0xbe, 0xfe, 0x54, 0xc9,
+0xa9, 0xa2, 0xa5, 0xbc, 0x3b, 0x2f, 0x35, 0xfe, 0xc9, 0xfe,
+0xfe, 0xc5, 0xa9, 0xa6, 0xb0, 0x54, 0x31, 0x31, 0x3f, 0xd3,
+0xbc, 0xc1, 0xcd, 0xb8, 0xae, 0xa8, 0xb4, 0xd3, 0x54, 0x4e,
+0x5c, 0x54, 0xfe, 0xdb, 0xba, 0xb4, 0xb4, 0xba, 0xcd, 0x5c,
+0x3d, 0x3f, 0x54, 0xfe, 0xcd, 0xaf, 0xa8, 0xac, 0xc5, 0xfe,
+0xfe, 0xe7, 0xdb, 0xfe, 0xfe, 0xfe, 0xe7, 0xb8, 0xaf, 0xb0,
+0xe7, 0x42, 0x4a, 0xcd, 0xbc, 0xdb, 0x46, 0x68, 0xcd, 0xb0,
+0xab, 0xbc, 0xfe, 0x3d, 0x46, 0xfe, 0xb8, 0xbc, 0xd3, 0xd3,
+0xb6, 0xb0, 0xb6, 0x5c, 0x3b, 0x35, 0x54, 0xdb, 0xba, 0xb4,
+0xc1, 0xc9, 0xc1, 0xba, 0xc9, 0x5c, 0x3d, 0x46, 0xfe, 0xcd,
+0xc5, 0xb8, 0xae, 0xaf, 0xb4, 0xd3, 0x54, 0x3d, 0x35, 0x46,
+0xfe, 0xdb, 0xbc, 0xb2, 0xa9, 0xab, 0xba, 0x3f, 0x31, 0x39,
+0xfe, 0xe7, 0xdb, 0xcd, 0xb8, 0xae, 0xab, 0xac, 0xe7, 0x3d,
+0x2d, 0x3f, 0xfe, 0xdb, 0xfe, 0xfe, 0xbc, 0xaa, 0xa8, 0xb0,
+0xfe, 0x31, 0x2d, 0x3d, 0xdb, 0xc5, 0xcd, 0xc9, 0xb4, 0xa8,
+0xad, 0xc5, 0x46, 0x39, 0x3f, 0x5c, 0xfe, 0xd3, 0xc5, 0xc1,
+0xb6, 0xb0, 0xbc, 0x68, 0x46, 0x4e, 0xe7, 0xfe, 0x5c, 0xfe,
+0xc1, 0xaf, 0xb0, 0xb8, 0xe7, 0x5c, 0x5c, 0xfe, 0xe7, 0xfe,
+0xfe, 0xe7, 0xb0, 0xab, 0xb2, 0x4a, 0x37, 0x3f, 0xcd, 0xbe,
+0xc1, 0xe7, 0xe7, 0xd3, 0xb6, 0xb4, 0xc9, 0x3b, 0x33, 0x4a,
+0xba, 0xb4, 0xc5, 0xfe, 0xc9, 0xb6, 0xb4, 0xcd, 0xfe, 0x3b,
+0x3b, 0xfe, 0xc1, 0xb6, 0xc5, 0xc5, 0xb8, 0xb0, 0xba, 0x4a,
+0x31, 0x35, 0x68, 0xcd, 0xc5, 0xba, 0xb4, 0xb0, 0xb0, 0xba,
+0x5c, 0x35, 0x2f, 0x4e, 0xd3, 0xc1, 0xdb, 0xd3, 0xb4, 0xa9,
+0xab, 0xcd, 0x3b, 0x2f, 0x35, 0xfe, 0xd3, 0xd3, 0xdb, 0xbc,
+0xad, 0xa4, 0xb0, 0xfe, 0x2d, 0x2f, 0x3f, 0xe7, 0xe7, 0xe7,
+0xcd, 0xb4, 0xaf, 0xad, 0xc5, 0x3d, 0x31, 0x3d, 0xe7, 0xd3,
+0xe7, 0xe7, 0xc1, 0xaf, 0xad, 0xb6, 0xfe, 0x4a, 0x42, 0x54,
+0xfe, 0x68, 0xfe, 0xd3, 0xb2, 0xae, 0xb4, 0xfe, 0x42, 0x4e,
+0xcd, 0xc5, 0xcd, 0xdb, 0xc9, 0xb4, 0xb0, 0xb6, 0xfe, 0x3b,
+0x42, 0xe7, 0xb0, 0xb8, 0xcd, 0xfe, 0xc9, 0xb6, 0xb8, 0xfe,
+0x42, 0x3d, 0xfe, 0xc1, 0xb0, 0xba, 0xd3, 0xfe, 0xc1, 0xb0,
+0xb6, 0xfe, 0x3b, 0x3f, 0xe7, 0xba, 0xb8, 0xbc, 0xc5, 0xc1,
+0xc1, 0xcd, 0xfe, 0x3b, 0x37, 0xfe, 0xc1, 0xb4, 0xb6, 0xb8,
+0xb6, 0xb8, 0xc5, 0x5c, 0x3f, 0x46, 0xfe, 0xcd, 0xc5, 0xcd,
+0xcd, 0xc1, 0xb2, 0xb2, 0xfe, 0x3f, 0x35, 0x54, 0xdb, 0xc1,
+0xcd, 0xcd, 0xbc, 0xaf, 0xac, 0xb6, 0x54, 0x35, 0x31, 0x68,
+0xba, 0xb8, 0xcd, 0xdb, 0xc9, 0xb2, 0xb4, 0xc9, 0x46, 0x39,
+0x42, 0xdb, 0xbc, 0xbc, 0xcd, 0xcd, 0xbe, 0xb2, 0xb8, 0xe7,
+0x54, 0x46, 0xfe, 0xfe, 0xdb, 0xc9, 0xc5, 0xbe, 0xbe, 0xc9,
+0xfe, 0x5c, 0x5c, 0xfe, 0xd3, 0xcd, 0xcd, 0xc5, 0xb6, 0xb2,
+0xc5, 0x68, 0x4e, 0xfe, 0xc5, 0xc1, 0xcd, 0x68, 0x5c, 0xe7,
+0xb8, 0xb6, 0xd3, 0x4a, 0x46, 0xfe, 0xbc, 0xb8, 0xc1, 0xe7,
+0xe7, 0xc1, 0xb4, 0xbe, 0xfe, 0x3f, 0x3f, 0xfe, 0xba, 0xb2,
+0xba, 0xe7, 0xfe, 0xcd, 0xcd, 0xfe, 0x4e, 0x46, 0xfe, 0xc5,
+0xb8, 0xb2, 0xba, 0xc1, 0xcd, 0xd3, 0xe7, 0xfe, 0x5c, 0x5c,
+0xfe, 0xe7, 0xc5, 0xbe, 0xb6, 0xba, 0xc5, 0xfe, 0x3f, 0x3f,
+0x54, 0xfe, 0xd3, 0xc1, 0xbc, 0xb6, 0xb0, 0xb0, 0xd3, 0x54,
+0x39, 0x46, 0xfe, 0xc1, 0xcd, 0xe7, 0xe7, 0xc5, 0xb8, 0xb4,
+0xd3, 0x54, 0x37, 0x42, 0xdb, 0xbe, 0xc1, 0xd3, 0xcd, 0xb8,
+0xb0, 0xb0, 0xcd, 0x4a, 0x3b, 0x42, 0xe7, 0xc5, 0xbe, 0xcd,
+0xe7, 0xd3, 0xc5, 0xcd, 0xfe, 0x54, 0x54, 0x68, 0xe7, 0xc5,
+0xc1, 0xc1, 0xcd, 0xcd, 0xc9, 0xc9, 0xcd, 0xe7, 0xfe, 0xfe,
+0xfe, 0xe7, 0xc5, 0xbe, 0xc1, 0xfe, 0x5c, 0x5c, 0xfe, 0xcd,
+0xcd, 0xcd, 0xdb, 0xd3, 0xc1, 0xbc, 0xbe, 0xfe, 0x4e, 0x54,
+0xcd, 0xb6, 0xb8, 0xd3, 0x5c, 0x5c, 0xfe, 0xc5, 0xc9, 0xfe,
+0x46, 0x4a, 0xe7, 0xb4, 0xb6, 0xc5, 0xfe, 0xe7, 0xcd, 0xc9,
+0xdb, 0xfe, 0x4e, 0x68, 0xd3, 0xb6, 0xb2, 0xbc, 0xfe, 0x68,
+0xfe, 0xfe, 0x68, 0x54, 0x68, 0xe7, 0xc5, 0xbc, 0xb8, 0xbe,
+0xcd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xd3, 0xd3, 0xcd,
+0xc1, 0xb8, 0xbc, 0xdb, 0x4e, 0x42, 0x4a, 0xfe, 0xc9, 0xc1,
+0xcd, 0xd3, 0xcd, 0xba, 0xb8, 0xcd, 0x46, 0x3b, 0xfe, 0xc9,
+0xba, 0xcd, 0xe7, 0xfe, 0xd3, 0xc1, 0xba, 0xdb, 0x54, 0x3d,
+0x68, 0xd3, 0xbc, 0xcd, 0xfe, 0xfe, 0xc5, 0xbe, 0xc1, 0xe7,
+0x54, 0x4a, 0xfe, 0xc9, 0xc1, 0xcd, 0xfe, 0xfe, 0xd3, 0xd3,
+0xd3, 0xfe, 0xe7, 0xe7, 0xe7, 0xdb, 0xd3, 0xe7, 0xe7, 0xe7,
+0xfe, 0xfe, 0xfe, 0xfe, 0xcd, 0xc9, 0xdb, 0xfe, 0xfe, 0xdb,
+0xbe, 0xc9, 0xfe, 0x5c, 0xfe, 0xc9, 0xbc, 0xbe, 0xdb, 0x68,
+0x5c, 0xdb, 0xc5, 0xd3, 0x54, 0x46, 0xfe, 0xbc, 0xb2, 0xb8,
+0xdb, 0x68, 0x68, 0xe7, 0xcd, 0xdb, 0x5c, 0x54, 0xfe, 0xc1,
+0xb8, 0xc1, 0xe7, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe,
+0xd3, 0xc5, 0xc1, 0xc5, 0xcd, 0xd3, 0xe7, 0xfe, 0x54, 0x4e,
+0xfe, 0xd3, 0xcd, 0xd3, 0xd3, 0xc5, 0xc1, 0xc1, 0xe7, 0x5c,
+0x4e, 0x5c, 0xd3, 0xc1, 0xcd, 0xfe, 0xfe, 0xcd, 0xba, 0xba,
+0xe7, 0x4a, 0x4a, 0x68, 0xcd, 0xc5, 0xcd, 0xfe, 0xfe, 0xcd,
+0xb8, 0xc1, 0xe7, 0x4e, 0x5c, 0xe7, 0xc1, 0xc9, 0xdb, 0xfe,
+0xe7, 0xc9, 0xc5, 0xd3, 0xfe, 0x68, 0xfe, 0xdb, 0xd3, 0xe7,
+0xfe, 0xfe, 0xcd, 0xc9, 0xcd, 0xd3, 0xd3, 0xd3, 0xcd, 0xe7,
+0xfe, 0xfe, 0xe7, 0xc5, 0xc5, 0xe7, 0x68, 0x68, 0xe7, 0xc1,
+0xc5, 0xfe, 0x5c, 0xfe, 0xd3, 0xc1, 0xd3, 0xfe, 0x68, 0xe7,
+0xc5, 0xb6, 0xc5, 0xe7, 0x68, 0xfe, 0xcd, 0xc5, 0xe7, 0xfe,
+0x54, 0xfe, 0xc9, 0xc5, 0xdb, 0xfe, 0xfe, 0xfe, 0xd3, 0xd3,
+0xfe, 0xfe, 0xfe, 0xcd, 0xc1, 0xc1, 0xc9, 0xd3, 0xd3, 0xe7,
+0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xd3, 0xdb, 0xe7, 0xe7, 0xd3,
+0xcd, 0xd3, 0xfe, 0xfe, 0xfe, 0xcd, 0xc5, 0xd3, 0xe7, 0xe7,
+0xc9, 0xbc, 0xbe, 0xe7, 0x68, 0x4a, 0xfe, 0xdb, 0xcd, 0xfe,
+0xfe, 0xfe, 0xcd, 0xc1, 0xc9, 0xfe, 0x54, 0x5c, 0xe7, 0xc9,
+0xc5, 0xe7, 0xfe, 0xfe, 0xcd, 0xc5, 0xc5, 0xe7, 0xfe, 0xfe,
+0xfe, 0xe7, 0xe7, 0xfe, 0xfe, 0xdb, 0xd3, 0xd3, 0xdb, 0xe7,
+0xfe, 0xfe, 0xe7, 0xe7, 0xdb, 0xd3, 0xc9, 0xd3, 0xe7, 0xfe,
+0xfe, 0xd3, 0xd3, 0xdb, 0xfe, 0xfe, 0xfe, 0xd3, 0xcd, 0xcd,
+0xfe, 0xfe, 0xe7, 0xc9, 0xc5, 0xd3, 0xfe, 0xfe, 0xfe, 0xcd,
+0xc9, 0xd3, 0xfe, 0xfe, 0xfe, 0xdb, 0xc9, 0xcd, 0xe7, 0xfe,
+0xe7, 0xcd, 0xcd, 0xe7, 0xfe, 0xfe, 0xe7, 0xd3, 0xc5, 0xcd,
+0xe7, 0xfe, 0xfe, 0xfe, 0xdb, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe,
+0xe7, 0xcd, 0xcd, 0xd3, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe,
+0xe7, 0xe7, 0xdb, 0xc9, 0xc1, 0xc5, 0xfe, 0x5c, 0x68, 0xfe,
+0xd3, 0xdb, 0xe7, 0xe7, 0xe7, 0xd3, 0xc5, 0xcd, 0xe7, 0x68,
+0xfe, 0xe7, 0xcd, 0xd3, 0xe7, 0xfe, 0xe7, 0xcd, 0xc1, 0xc1,
+0xdb, 0xfe, 0x54, 0xfe, 0xe7, 0xcd, 0xe7, 0xfe, 0xe7, 0xd3,
+0xcd, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xcd, 0xc5, 0xcd, 0xfe,
+0xfe, 0xe7, 0xcd, 0xd3, 0xdb, 0xe7, 0xfe, 0xfe, 0xfe, 0xe7,
+0xd3, 0xd3, 0xe7, 0xfe, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe,
+0xfe, 0xdb, 0xc5, 0xc1, 0xd3, 0xfe, 0xfe, 0xfe, 0xd3, 0xc9,
+0xcd, 0xe7, 0xfe, 0xfe, 0xd3, 0xcd, 0xdb, 0xfe, 0x5c, 0xfe,
+0xcd, 0xc9, 0xd3, 0xfe, 0xfe, 0xfe, 0xd3, 0xc9, 0xcd, 0xfe,
+0x68, 0xfe, 0xd3, 0xc1, 0xc1, 0xdb, 0xfe, 0xfe, 0xe7, 0xe7,
+0xfe, 0xfe, 0x68, 0xfe, 0xe7, 0xc5, 0xc9, 0xdb, 0xfe, 0xfe,
+0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xdb, 0xc5, 0xc5,
+0xd3, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xfe,
+0xc9, 0xc1, 0xc5, 0xfe, 0x54, 0x5c, 0xfe, 0xcd, 0xc5, 0xcd,
+0xfe, 0xfe, 0xdb, 0xc5, 0xc9, 0xfe, 0x5c, 0x68, 0xfe, 0xcd,
+0xcd, 0xfe, 0xfe, 0xfe, 0xe7, 0xc5, 0xc1, 0xd3, 0xfe, 0xfe,
+0xdb, 0xc9, 0xc5, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe,
+0xfe, 0xfe, 0xe7, 0xcd, 0xcd, 0xdb, 0xfe, 0xfe, 0xfe, 0xfe,
+0xe7, 0xd3, 0xcd, 0xd3, 0xfe, 0xfe, 0xdb, 0xcd, 0xd3, 0xe7,
+0xfe, 0xfe, 0xfe, 0xdb, 0xcd, 0xd3, 0xe7, 0xfe, 0xd3, 0xc5,
+0xc9, 0xfe, 0x5c, 0x54, 0xfe, 0xcd, 0xc1, 0xcd, 0xe7, 0xfe,
+0xfe, 0xd3, 0xcd, 0xfe, 0x54, 0x5c, 0xe7, 0xc1, 0xc1, 0xd3,
+0xfe, 0xfe, 0xe7, 0xd3, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xcd,
+0xc5, 0xcd, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xe7, 0xd3, 0xcd, 0xc9, 0xcd, 0xe7, 0xfe, 0xfe, 0xfe, 0xdb,
+0xc9, 0xcd, 0xe7, 0xfe, 0xe7, 0xc9, 0xc5, 0xdb, 0xfe, 0x5c,
+0xfe, 0xe7, 0xcd, 0xcd, 0xe7, 0xfe, 0xe7, 0xc5, 0xc1, 0xd3,
+0xfe, 0x5c, 0xfe, 0xcd, 0xc5, 0xcd, 0xe7, 0xfe, 0xfe, 0xe7,
+0xd3, 0xe7, 0xfe, 0xfe, 0xe7, 0xcd, 0xcd, 0xdb, 0xfe, 0xfe,
+0xfe, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xe7, 0xdb, 0xcd, 0xd3,
+0xd3, 0xdb, 0xfe, 0xfe, 0xfe, 0xfe, 0xdb, 0xd3, 0xdb, 0xe7,
+0xe7, 0xdb, 0xd3, 0xe7, 0xfe, 0xfe, 0xfe, 0xe7, 0xc9, 0xc5,
+0xcd, 0xe7, 0xfe, 0xdb, 0xd3, 0xe7, 0xfe, 0x68, 0xfe, 0xe7,
+0xcd, 0xcd, 0xd3, 0xfe, 0xfe, 0xe7, 0xdb, 0xe7, 0xfe, 0x68,
+0xfe, 0xdb, 0xfe, 0x68, 0xbe, 0xb2, 0xae, 0xab, 0xb2, 0xfe,
+0x2f, 0x31, 0xdb, 0xac, 0xad, 0xaf, 0xab, 0xab, 0xb4, 0x68,
+0x37, 0x39, 0x3f, 0xe7, 0xb4, 0xa8, 0xaa, 0xb0, 0xbc, 0xbc,
+0xc5, 0x3f, 0x31, 0x3d, 0xfe, 0xc1, 0xb8, 0xb0, 0xa5, 0xa2,
+0xa8, 0xaf, 0xdb, 0x3b, 0x28, 0x2a, 0x3d, 0xbc, 0xb0, 0xaa,
+0xa2, 0x9f, 0xab, 0xfe, 0x29, 0x24, 0x29, 0x4a, 0xb4, 0xaa,
+0xa8, 0xa9, 0xa8, 0xa5, 0xac, 0xdb, 0x2c, 0x27, 0x35, 0x4a,
+0xfe, 0xcd, 0xb2, 0xa2, 0x9f, 0x9f, 0xae, 0x4e, 0x2c, 0x22,
+0x33, 0xfe, 0xba, 0xb0, 0xa6, 0x9f, 0xa3, 0xbc, 0x5c, 0x33,
+0x31, 0x39, 0x5c, 0xcd, 0xc1, 0xb4, 0xad, 0xaa, 0xad, 0xcd,
+0x54, 0x46, 0xfe, 0xe7, 0xfe, 0x54, 0xc5, 0xaf, 0xa6, 0xa9,
+0xb0, 0xfe, 0x3d, 0x39, 0x5c, 0xdb, 0xdb, 0xfe, 0xba, 0xac,
+0xa8, 0xc5, 0x39, 0x33, 0x54, 0xb8, 0xae, 0xad, 0xb8, 0xc1,
+0xcd, 0xbe, 0xbc, 0xfe, 0x39, 0x37, 0xfe, 0xb4, 0xba, 0xcd,
+0xdb, 0xb8, 0xb0, 0xb6, 0xfe, 0x4e, 0x39, 0x3d, 0xfe, 0xb0,
+0xaa, 0xa9, 0xa9, 0xaa, 0xb0, 0x5c, 0x29, 0x28, 0x31, 0xfe,
+0xba, 0xb4, 0xae, 0xab, 0xab, 0xb2, 0xfe, 0x3b, 0x2a, 0x2f,
+0x54, 0xb4, 0xb4, 0xba, 0xb2, 0xa3, 0x9f, 0xa8, 0xfe, 0x2c,
+0x27, 0x2a, 0x46, 0xfe, 0xc1, 0xbc, 0xb0, 0xa2, 0xa2, 0xb0,
+0x33, 0x22, 0x2b, 0x46, 0xc1, 0xb4, 0xb0, 0xab, 0xa8, 0xa8,
+0xb0, 0xdb, 0x42, 0x2c, 0x33, 0x4a, 0xfe, 0x5c, 0xdb, 0xb4,
+0xa8, 0xad, 0xba, 0xfe, 0x46, 0x39, 0x39, 0x4a, 0xfe, 0xbc,
+0xab, 0xa5, 0xa5, 0xb8, 0x68, 0x37, 0x4a, 0xe7, 0xfe, 0x4a,
+0x5c, 0xd3, 0xb0, 0xb2, 0xc1, 0x5c, 0x42, 0x46, 0xd3, 0xb4,
+0xbe, 0x54, 0x54, 0xb6, 0xab, 0xae, 0xe7, 0x46, 0x4a, 0xfe,
+0xcd, 0xc9, 0xd3, 0xe7, 0xe7, 0xbe, 0xb4, 0xc5, 0x37, 0x2c,
+0x37, 0xc1, 0xb0, 0xb2, 0xb4, 0xb2, 0xb6, 0xdb, 0x54, 0x4a,
+0x46, 0x42, 0x68, 0xba, 0xb2, 0xba, 0xc5, 0xb6, 0xb6, 0xcd,
+0x33, 0x2f, 0x39, 0x68, 0xfe, 0xe7, 0xba, 0xac, 0xa7, 0xa7,
+0xb2, 0xe7, 0x2d, 0x25, 0x2f, 0xd3, 0xbe, 0xd3, 0xc5, 0xac,
+0xa6, 0xac, 0xfe, 0x33, 0x2c, 0x2d, 0x54, 0xc1, 0xb4, 0xcd,
+0xcd, 0xaf, 0xa4, 0xa8, 0xe7, 0x31, 0x31, 0x39, 0x46, 0xfe,
+0xdb, 0xbc, 0xb6, 0xaf, 0xa9, 0xb2, 0xfe, 0x2f, 0xfe, 0xba,
+0xad, 0xba, 0x4e, 0x3d, 0x42, 0xfe, 0xc9, 0xc1, 0xe7, 0xfe,
+0xc1, 0xa9, 0xa6, 0xcd, 0x2a, 0x25, 0x3b, 0xbc, 0xb0, 0xb6,
+0xb8, 0xb4, 0xb4, 0xb8, 0xc1, 0xfe, 0x3d, 0x3d, 0xfe, 0xba,
+0xd3, 0x54, 0x54, 0xbe, 0xb0, 0xb4, 0xe7, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xc5, 0xb6, 0xa9, 0xaa, 0xba, 0x3d, 0x39,
+0xfe, 0xc1, 0xfe, 0x4a, 0x54, 0xbe, 0xb2, 0xb8, 0xfe, 0x3d,
+0x3b, 0xfe, 0xb0, 0xab, 0xc5, 0x39, 0x3b, 0xbc, 0xa7, 0xab,
+0xd3, 0x68, 0xfe, 0xd3, 0xcd, 0xfe, 0x54, 0x3d, 0xfe, 0xbc,
+0xac, 0xc9, 0x3f, 0x2e, 0xfe, 0xba, 0xb0, 0xba, 0xba, 0xb6,
+0xba, 0xd3, 0xfe, 0xfe, 0x5c, 0x54, 0xc9, 0xb4, 0xbe, 0x54,
+0x68, 0xcd, 0xb6, 0xfe, 0x46, 0x54, 0xcd, 0xc5, 0xdb, 0xfe,
+0xe7, 0xc1, 0xae, 0xa8, 0xac, 0xfe, 0x2e, 0x2e, 0xfe, 0xb6,
+0xc1, 0x5c, 0xe7, 0xb6, 0xaa, 0xb0, 0x54, 0x35, 0x2e, 0x4a,
+0xc1, 0xac, 0xbc, 0xfe, 0xfe, 0xaf, 0xa6, 0xac, 0xfe, 0x42,
+0x46, 0x5c, 0xfe, 0xfe, 0xfe, 0xe7, 0xc9, 0xae, 0xa9, 0xb0,
+0x54, 0x31, 0x37, 0xfe, 0xd3, 0xd3, 0xb8, 0xac, 0xab, 0xb6,
+0xe7, 0xfe, 0xfe, 0x68, 0xfe, 0xfe, 0xfe, 0x54, 0xfe, 0xb0,
+0xae, 0xb8, 0xfe, 0xe7, 0xc1, 0xb6, 0xe7, 0x46, 0x3d, 0xe7,
+0xae, 0xa7, 0xab, 0xdb, 0x3f, 0x37, 0xfe, 0xba, 0xcd, 0x3f,
+0x42, 0xc5, 0xab, 0xac, 0xc9, 0x46, 0x3d, 0x54, 0xba, 0xad,
+0xb0, 0xfe, 0x68, 0xcd, 0xb0, 0xb0, 0xc9, 0x54, 0x54, 0xfe,
+0xfe, 0xfe, 0xfe, 0xe7, 0xcd, 0xbe, 0xba, 0xc5, 0x68, 0x42,
+0x46, 0xe7, 0xc5, 0xba, 0xaf, 0xa7, 0xa7, 0xbc, 0xfe, 0x3d,
+0x4a, 0x68, 0xfe, 0xfe, 0xfe, 0xe7, 0xbc, 0xaf, 0xae, 0xc5,
+0x3d, 0x39, 0xfe, 0xbc, 0xbe, 0xfe, 0x68, 0xc9, 0xa9, 0xa2,
+0xaa, 0xbc, 0x3b, 0x2d, 0x35, 0xfe, 0xcd, 0xfe, 0xfe, 0xb4,
+0xa9, 0xa6, 0xbc, 0x54, 0x31, 0x31, 0x54, 0xd3, 0xbc, 0xc5,
+0xcd, 0xb8, 0xab, 0xa8, 0xb4, 0xfe, 0x54, 0x4e, 0x68, 0x54,
+0xfe, 0xc9, 0xba, 0xb4, 0xb4, 0xba, 0xcd, 0x5c, 0x3b, 0x3f,
+0x54, 0xfe, 0xcd, 0xaf, 0xa8, 0xac, 0xc5, 0x68, 0xfe, 0xe7,
+0xdb, 0xfe, 0xfe, 0xfe, 0xcd, 0xb8, 0xaf, 0xb6, 0xe7, 0x42,
+0x5c, 0xcd, 0xbc, 0xfe, 0x46, 0x68, 0xba, 0xb0, 0xab, 0xbc,
+0x54, 0x3d, 0x46, 0xc9, 0xb8, 0xbc, 0xdb, 0xd3, 0xb6, 0xb0,
+0xb6, 0x5c, 0x37, 0x35, 0x54, 0xc9, 0xba, 0xb4, 0xc1, 0xc9,
+0xc1, 0xba, 0xe7, 0x5c, 0x3d, 0x54, 0xfe, 0xcd, 0xc5, 0xb8,
+0xae, 0xaf, 0xb4, 0xd3, 0x54, 0x3b, 0x35, 0x46, 0xfe, 0xdb,
+0xbc, 0xaf, 0xa9, 0xab, 0xd3, 0x3f, 0x31, 0x3f, 0xfe, 0xe7,
+0xdb, 0xcd, 0xb8, 0xae, 0xaa, 0xac, 0xe7, 0x33, 0x2d, 0x3f,
+0xd3, 0xdb, 0xfe, 0xfe, 0xbc, 0xaa, 0xa9, 0xb0, 0xfe, 0x31,
+0x2f, 0x3d, 0xdb, 0xc5, 0xcd, 0xc9, 0xae, 0xa8, 0xad, 0xfe,
+0x46, 0x39, 0x46, 0x5c, 0xfe, 0xcd, 0xc5, 0xc1, 0xb6, 0xb0,
+0xbc, 0x68, 0x42, 0x4e, 0xe7, 0xfe, 0x5c, 0xfe, 0xb6, 0xaf,
+0xb0, 0xc5, 0xe7, 0x5c, 0x5c, 0xfe, 0xe7, 0xfe, 0x68, 0xe7,
+0xb0, 0xac, 0xb2, 0x4a, 0x35, 0x3f, 0xcd, 0xbc, 0xc1, 0xe7,
+0xe7, 0xd3, 0xb6, 0xb4, 0xfe, 0x3b, 0x33, 0xfe, 0xba, 0xb4,
+0xd3, 0xfe, 0xc9, 0xb4, 0xb4, 0xcd, 0x4a, 0x3b, 0x3b, 0xfe,
+0xb8, 0xb6, 0xc5, 0xc5, 0xb8, 0xb0, 0xcd, 0x4a, 0x31, 0x3b,
+0x68, 0xcd, 0xc1, 0xba, 0xb4, 0xb0, 0xb0, 0xba, 0x5c, 0x2f,
0x2f, 0x4e, 0xc9, 0xc1, 0xdb, 0xc9, 0xb4 };
*/
static unsigned char leave[] = {
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xc1, 0x3d,
-0x42, 0x46, 0x3f, 0x3f, 0x46, 0x3f, 0x4e, 0xba, 0xbe, 0xbe,
-0xbc, 0xba, 0xbe, 0xc5, 0xb6, 0x2e, 0x2c, 0x33, 0x2f, 0x2e,
-0x2f, 0x33, 0x2b, 0x54, 0xac, 0xb0, 0xb0, 0xad, 0xaf, 0xb0,
-0xae, 0xcd, 0x3b, 0x2f, 0x31, 0x2e, 0x2f, 0x31, 0x2e, 0x46,
-0xc5, 0xaf, 0xb0, 0xaf, 0xae, 0xaf, 0xaf, 0xb0, 0xfe, 0x2d,
-0x31, 0x31, 0x2e, 0x31, 0x2f, 0x31, 0xfe, 0xae, 0xaf, 0xaf,
-0xae, 0xb0, 0xae, 0xaf, 0xfe, 0xdb, 0x2e, 0x2e, 0x31, 0x31,
-0x2d, 0x2e, 0xdb, 0x68, 0xaf, 0xad, 0xb0, 0xb0, 0xae, 0xaf,
-0x5c, 0xe7, 0x39, 0x2d, 0x31, 0x31, 0x31, 0x2d, 0xfe, 0xfe,
-0x68, 0xad, 0xaf, 0xb0, 0xaf, 0xac, 0xbc, 0xfe, 0xd3, 0x2f,
-0x2e, 0x33, 0x31, 0x2d, 0x4e, 0xdb, 0xfe, 0xfe, 0xac, 0xaf,
-0xb0, 0xac, 0xb6, 0x68, 0xe7, 0xdb, 0x2e, 0x2f, 0x35, 0x2f,
-0x31, 0xe7, 0xe7, 0x68, 0xad, 0xac, 0xb0, 0xae, 0xac, 0xfe,
-0xfe, 0xdb, 0xfe, 0x2d, 0x33, 0x31, 0x2e, 0xfe, 0xfe, 0xfe,
-0xfe, 0xbc, 0xaf, 0xb0, 0xad, 0xfe, 0xfe, 0xfe, 0xe7, 0x5c,
-0x2e, 0x33, 0x2e, 0x35, 0xe7, 0xfe, 0xfe, 0xfe, 0xad, 0xb0,
-0xaf, 0xc1, 0xfe, 0xe7, 0xfe, 0xe7, 0x3d, 0x31, 0x2f, 0x37,
-0xe7, 0xfe, 0xfe, 0xe7, 0xfe, 0xaf, 0xad, 0xbe, 0xfe, 0xdb,
-0xfe, 0xfe, 0xdb, 0x35, 0x2d, 0x39, 0xdb, 0xfe, 0xfe, 0xdb,
-0xfe, 0xfe, 0xad, 0xaf, 0xfe, 0xfe, 0xe7, 0x68, 0xfe, 0xd3,
-0x2e, 0x2c, 0xdb, 0xdb, 0x2c, 0x35, 0xd3, 0x68, 0xaf, 0xad,
-0xb0, 0xb0, 0xad, 0xba, 0x68, 0xe7, 0xe7, 0x2e, 0x2f, 0x33,
-0x31, 0x2d, 0xdb, 0xd3, 0x5c, 0xae, 0xaa, 0xe7, 0x68, 0xaa,
-0xe7, 0xfe, 0xdb, 0xe7, 0xfe, 0xe7, 0xd3, 0x2d, 0xfe, 0xdb,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xc5, 0xfe, 0xe7, 0xe7,
-0xfe, 0xfe, 0xe7, 0xe7, 0x3b, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xc5, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xfe, 0x3b,
-0xdb, 0xfe, 0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xb0, 0xfe, 0xfe,
-0xe7, 0xfe, 0xfe, 0xfe, 0xdb, 0x2e, 0x5c, 0xdb, 0xfe, 0xfe,
-0xe7, 0xe7, 0x68, 0xb0, 0xbe, 0x68, 0xe7, 0xe7, 0xfe, 0xfe,
-0xdb, 0x39, 0x2f, 0xdb, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xbe,
-0xaf, 0xe7, 0x68, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0x33, 0x33,
-0xdb, 0xfe, 0xfe, 0xdb, 0xe7, 0xfe, 0xb0, 0xb0, 0xfe, 0xfe,
-0xe7, 0xfe, 0xfe, 0xfe, 0x35, 0x33, 0xe7, 0xe7, 0xfe, 0xe7,
-0xe7, 0xfe, 0xb0, 0xb2, 0xb0, 0xfe, 0xfe, 0xe7, 0xfe, 0xe7,
-0x46, 0x35, 0x35, 0x3f, 0xe7, 0xfe, 0xe7, 0xfe, 0xb2, 0xb0,
-0xb2, 0xb0, 0xfe, 0xfe, 0xfe, 0xfe, 0x42, 0x35, 0x37, 0x33,
-0xe7, 0xfe, 0xfe, 0xfe, 0xb8, 0xb0, 0xb6, 0xb0, 0xba, 0xfe,
-0xfe, 0xe7, 0xe7, 0x33, 0x39, 0x39, 0x33, 0xe7, 0xdb, 0xfe,
-0xe7, 0xb0, 0xb4, 0xb6, 0xb0, 0xcd, 0xfe, 0xe7, 0xe7, 0x33,
-0x39, 0x3b, 0x33, 0x46, 0xd3, 0xfe, 0xfe, 0xb0, 0xb2, 0xb6,
-0xb4, 0xb0, 0xfe, 0xfe, 0xdb, 0x35, 0x37, 0x39, 0x39, 0x35,
-0x37, 0xdb, 0x68, 0xcd, 0xb2, 0xb6, 0xb6, 0xb4, 0xb4, 0x68,
-0xe7, 0x42, 0x37, 0x3b, 0x3b, 0x39, 0x37, 0xdb, 0xfe, 0xcd,
-0xb2, 0xb6, 0xb6, 0xb6, 0xb2, 0xb4, 0xfe, 0x54, 0x37, 0x3b,
-0x39, 0x3b, 0x3b, 0x39, 0xe7, 0xfe, 0xb6, 0xb6, 0xb6, 0xb4,
-0xb6, 0xb6, 0xbc, 0xfe, 0x3f, 0x3b, 0x3b, 0x39, 0x3b, 0x3b,
-0x39, 0xe7, 0xb6, 0xb8, 0xb8, 0xb6, 0xb8, 0xb8, 0xb4, 0xfe,
-0x3b, 0x3d, 0x3d, 0x3b, 0x39, 0x3d, 0x3b, 0x39, 0xbe, 0xb8,
-0xba, 0xb8, 0xb6, 0xb8, 0xba, 0xb4, 0xfe, 0x39, 0x3f, 0x3d,
-0x3b, 0x3d, 0x3f, 0x39, 0xdb, 0xb4, 0xba, 0xb8, 0xb6, 0xb8,
-0xbc, 0xb4, 0xba, 0x39, 0x42, 0x3f, 0x3d, 0x3d, 0x3f, 0x3f,
-0x3b, 0xb8, 0xb6, 0xbc, 0xb8, 0xb8, 0xba, 0xbc, 0xb8, 0xe7,
-0x3d, 0x42, 0x3f, 0x3d, 0x3f, 0x42, 0x3d, 0xfe, 0xb8, 0xbc,
-0xbc, 0xba, 0xba, 0xbc, 0xba, 0xe7, 0x3d, 0x3f, 0x42, 0x3f,
-0x3f, 0x42, 0x42, 0xfe, 0xfe, 0xbc, 0xbc, 0xbe, 0xbc, 0xbe,
-0xbc, 0xc5, 0xe7, 0x68, 0x42, 0x46, 0x42, 0x46, 0x42, 0x46,
-0xfe, 0xfe, 0xbc, 0xbe, 0xbe, 0xbe, 0xbc, 0xc5, 0xfe, 0xdb,
-0x46, 0x46, 0x4a, 0x4a, 0x46, 0x46, 0xe7, 0xfe, 0xd3, 0xbe,
-0xc9, 0xc9, 0xc5, 0xc5, 0xe7, 0xdb, 0xd3, 0x4a, 0x4e, 0x54,
-0x4e, 0x4e, 0xfe, 0x5c, 0x54, 0xd3, 0xcd, 0xd3, 0xd3, 0xcd,
-0xd3, 0xd3, 0xcd, 0xfe, 0x5c, 0x68, 0x5c, 0x5c, 0x5c, 0x68,
-0x5c, 0x5c, 0xcd, 0xcd, 0xd3, 0xcd, 0xdb, 0xe7, 0xe7, 0xdb,
-0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7,
-0xfe, 0x5c, 0x5c, 0xfe, 0xfe, 0xfe, 0xfe, 0x46, 0x35, 0x35,
-0x37, 0x39, 0x3b, 0x39, 0x35, 0x33, 0x35, 0x5c, 0xd3, 0xcd,
-0xdb, 0xfe, 0xfe, 0xd3, 0xb0, 0xb0, 0xb0, 0xb4, 0xb4, 0xb6,
-0xb2, 0xb0, 0xb0, 0xb6, 0xcd, 0x5c, 0x68, 0xfe, 0xfe, 0xfe,
-0x3b, 0x33, 0x35, 0x37, 0x39, 0x3b, 0x39, 0x37, 0x35, 0x35,
-0x3f, 0xdb, 0xcd, 0xcd, 0xdb, 0xfe, 0xe7, 0xc5, 0xb0, 0xb0,
-0xb2, 0xb6, 0xb6, 0xb6, 0xb2, 0xb0, 0xb0, 0xcd, 0x5c, 0x5c,
-0xfe, 0xe7, 0xe7, 0xfe, 0x35, 0x35, 0x35, 0x39, 0x3b, 0x3b,
-0x39, 0x35, 0x33, 0x39, 0xdb, 0xcd, 0xd3, 0xe7, 0xfe, 0xfe,
-0xba, 0xb0, 0xb0, 0xb2, 0xb4, 0xb6, 0xb6, 0xb4, 0xb2, 0xb0,
-0xb4, 0xc9, 0x5c, 0x68, 0xfe, 0xfe, 0x5c, 0x3b, 0x35, 0x37,
-0x39, 0x3b, 0x3b, 0x3b, 0x39, 0x37, 0x37, 0x3d, 0xe7, 0xcd,
-0xdb, 0xfe, 0xe7, 0xbe, 0xb2, 0xb2, 0xb4, 0xb4, 0xb6, 0xb6,
-0xb6, 0xb4, 0xb0, 0xb0, 0xc5, 0x5c, 0x5c, 0xfe, 0xe7, 0xe7,
-0x4e, 0x35, 0x35, 0x37, 0x3b, 0x3b, 0x3b, 0x39, 0x37, 0x37,
-0x3b, 0xe7, 0xc9, 0xcd, 0xe7, 0xfe, 0xd3, 0xb4, 0xb2, 0xb2,
-0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2, 0xb4, 0xc1, 0x68,
-0x68, 0xfe, 0xfe, 0x42, 0x39, 0x37, 0x39, 0x3b, 0x3b, 0x3b,
-0x3b, 0x3b, 0x39, 0x37, 0x3b, 0xfe, 0xd3, 0xdb, 0xfe, 0xcd,
-0xb4, 0xb2, 0xb4, 0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2,
-0xb2, 0xc1, 0x5c, 0x5c, 0xfe, 0xfe, 0xfe, 0x3d, 0x37, 0x37,
-0x39, 0x3b, 0x3b, 0x3b, 0x3b, 0x37, 0x37, 0x39, 0xfe, 0xcd,
-0xd3, 0xfe, 0xfe, 0xc1, 0xb2, 0xb2, 0xb4, 0xb6, 0xb6, 0xb6,
-0xb6, 0xb6, 0xb6, 0xb4, 0xb4, 0xbc, 0x68, 0xfe, 0xfe, 0xfe,
-0x3b, 0x39, 0x39, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x39,
-0x39, 0x3b, 0xfe, 0xdb, 0xe7, 0xfe, 0xbc, 0xb6, 0xb6, 0xb6,
-0xb8, 0xb6, 0xb6, 0xb6, 0xb8, 0xb6, 0xb4, 0xb4, 0xbc, 0xfe,
-0x68, 0xfe, 0xe7, 0x5c, 0x3b, 0x39, 0x39, 0x3b, 0x3b, 0x3b,
-0x3d, 0x3d, 0x3b, 0x39, 0x3b, 0x68, 0xdb, 0xdb, 0xfe, 0xe7,
-0xb8, 0xb6, 0xb6, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb6,
-0xb4, 0xb6, 0xdb, 0x68, 0xfe, 0xfe, 0x46, 0x3b, 0x3b, 0x3b,
-0x3d, 0x3d, 0x3b, 0x3d, 0x3d, 0x3d, 0x3d, 0x3b, 0x3b, 0x5c,
-0xdb, 0xdb, 0xc9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
-0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbc, 0xcd, 0xfe, 0xfe, 0x3d,
-0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3b, 0x3d, 0x3d, 0x3d, 0x3d,
-0x3b, 0x3d, 0x46, 0xfe, 0xe7, 0xe7, 0xc5, 0xb8, 0xb8, 0xb8,
-0xba, 0xba, 0xb8, 0xb8, 0xba, 0xba, 0xb8, 0xb8, 0xb8, 0xcd,
-0xfe, 0xfe, 0x68, 0x3f, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d,
-0x3d, 0x3d, 0x3f, 0x3f, 0x3d, 0x3b, 0x4a, 0xfe, 0xdb, 0xbc,
-0xb8, 0xba, 0xba, 0xba, 0xba, 0xb8, 0xb8, 0xb8, 0xba, 0xba,
-0xba, 0xba, 0xba, 0xc5, 0xfe, 0x54, 0x3f, 0x3f, 0x3f, 0x3f,
-0x3f, 0x3f, 0x3d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x42,
-0xfe, 0xe7, 0xdb, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
-0xba, 0xba, 0xbc, 0xba, 0xba, 0xba, 0xc5, 0xfe, 0xfe, 0x4e,
-0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x42,
-0x42, 0x42, 0x3f, 0x46, 0xfe, 0xcd, 0xb8, 0xba, 0xbc, 0xbc,
-0xbc, 0xba, 0xba, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xba, 0xb8,
-0xbe, 0xfe, 0x42, 0x3d, 0x3f, 0x42, 0x42, 0x42, 0x3f, 0x3f,
-0x3f, 0x42, 0x42, 0x42, 0x42, 0x3f, 0x3f, 0x68, 0xdb, 0xc5,
-0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xba, 0xba, 0xba, 0xbc, 0xbc,
-0xbc, 0xbc, 0xba, 0xc1, 0xfe, 0xfe, 0x3f, 0x42, 0x46, 0x46,
-0x46, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x46, 0x42, 0x3f,
-0x42, 0x68, 0xbe, 0xba, 0xbc, 0xbe, 0xbe, 0xbe, 0xbc, 0xbc,
-0xbc, 0xbc, 0xbe, 0xc1, 0xbe, 0xbc, 0xba, 0xbe, 0x68, 0x3f,
-0x42, 0x46, 0x4a, 0x4a, 0x46, 0x42, 0x42, 0x42, 0x46, 0x46,
-0x46, 0x46, 0x42, 0x42, 0x68, 0xd3, 0xbc, 0xbc, 0xbe, 0xc1,
-0xc1, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc1, 0xbe, 0xbe,
-0xc1, 0xfe, 0x4e, 0x42, 0x46, 0x4a, 0x4a, 0x4a, 0x46, 0x46,
-0x46, 0x46, 0x4a, 0x4a, 0x4a, 0x46, 0x46, 0x68, 0xdb, 0xbe,
-0xbe, 0xc1, 0xc5, 0xc1, 0xc1, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1,
-0xc5, 0xc5, 0xbe, 0xbc, 0xc1, 0x4e, 0x46, 0x46, 0x4a, 0x4e,
-0x4e, 0x4a, 0x46, 0x46, 0x46, 0x4a, 0x4a, 0x4e, 0x4a, 0x46,
-0x46, 0xfe, 0xbe, 0xbe, 0xc1, 0xc9, 0xc5, 0xc5, 0xc1, 0xc1,
-0xc1, 0xc1, 0xc5, 0xc5, 0xc5, 0xc5, 0xbe, 0xc1, 0xfe, 0x4a,
-0x4a, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4a, 0x4a, 0x4a, 0x4e,
-0x54, 0x4e, 0x4a, 0x4a, 0x4e, 0xcd, 0xc1, 0xc5, 0xc5, 0xc9,
-0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xcd, 0xcd, 0xcd, 0xcd, 0xc9,
-0xc9, 0xd3, 0x68, 0x54, 0x5c, 0x68, 0x68, 0x68, 0x5c, 0x5c,
-0x5c, 0x5c, 0x5c, 0x68, 0x68, 0x5c, 0x54, 0x5c, 0xdb, 0xcd,
-0xcd, 0xdb, 0xdb, 0xdb, 0xdb, 0xd3, 0xd3, 0xe7, 0xe7, 0xe7,
-0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
-0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xc1, 0x3d,
+0x42, 0x46, 0x3f, 0x3f, 0x46, 0x3f, 0x4e, 0xba, 0xbe, 0xbe,
+0xbc, 0xba, 0xbe, 0xc5, 0xb6, 0x2e, 0x2c, 0x33, 0x2f, 0x2e,
+0x2f, 0x33, 0x2b, 0x54, 0xac, 0xb0, 0xb0, 0xad, 0xaf, 0xb0,
+0xae, 0xcd, 0x3b, 0x2f, 0x31, 0x2e, 0x2f, 0x31, 0x2e, 0x46,
+0xc5, 0xaf, 0xb0, 0xaf, 0xae, 0xaf, 0xaf, 0xb0, 0xfe, 0x2d,
+0x31, 0x31, 0x2e, 0x31, 0x2f, 0x31, 0xfe, 0xae, 0xaf, 0xaf,
+0xae, 0xb0, 0xae, 0xaf, 0xfe, 0xdb, 0x2e, 0x2e, 0x31, 0x31,
+0x2d, 0x2e, 0xdb, 0x68, 0xaf, 0xad, 0xb0, 0xb0, 0xae, 0xaf,
+0x5c, 0xe7, 0x39, 0x2d, 0x31, 0x31, 0x31, 0x2d, 0xfe, 0xfe,
+0x68, 0xad, 0xaf, 0xb0, 0xaf, 0xac, 0xbc, 0xfe, 0xd3, 0x2f,
+0x2e, 0x33, 0x31, 0x2d, 0x4e, 0xdb, 0xfe, 0xfe, 0xac, 0xaf,
+0xb0, 0xac, 0xb6, 0x68, 0xe7, 0xdb, 0x2e, 0x2f, 0x35, 0x2f,
+0x31, 0xe7, 0xe7, 0x68, 0xad, 0xac, 0xb0, 0xae, 0xac, 0xfe,
+0xfe, 0xdb, 0xfe, 0x2d, 0x33, 0x31, 0x2e, 0xfe, 0xfe, 0xfe,
+0xfe, 0xbc, 0xaf, 0xb0, 0xad, 0xfe, 0xfe, 0xfe, 0xe7, 0x5c,
+0x2e, 0x33, 0x2e, 0x35, 0xe7, 0xfe, 0xfe, 0xfe, 0xad, 0xb0,
+0xaf, 0xc1, 0xfe, 0xe7, 0xfe, 0xe7, 0x3d, 0x31, 0x2f, 0x37,
+0xe7, 0xfe, 0xfe, 0xe7, 0xfe, 0xaf, 0xad, 0xbe, 0xfe, 0xdb,
+0xfe, 0xfe, 0xdb, 0x35, 0x2d, 0x39, 0xdb, 0xfe, 0xfe, 0xdb,
+0xfe, 0xfe, 0xad, 0xaf, 0xfe, 0xfe, 0xe7, 0x68, 0xfe, 0xd3,
+0x2e, 0x2c, 0xdb, 0xdb, 0x2c, 0x35, 0xd3, 0x68, 0xaf, 0xad,
+0xb0, 0xb0, 0xad, 0xba, 0x68, 0xe7, 0xe7, 0x2e, 0x2f, 0x33,
+0x31, 0x2d, 0xdb, 0xd3, 0x5c, 0xae, 0xaa, 0xe7, 0x68, 0xaa,
+0xe7, 0xfe, 0xdb, 0xe7, 0xfe, 0xe7, 0xd3, 0x2d, 0xfe, 0xdb,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xc5, 0xfe, 0xe7, 0xe7,
+0xfe, 0xfe, 0xe7, 0xe7, 0x3b, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xc5, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7, 0xfe, 0x3b,
+0xdb, 0xfe, 0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xb0, 0xfe, 0xfe,
+0xe7, 0xfe, 0xfe, 0xfe, 0xdb, 0x2e, 0x5c, 0xdb, 0xfe, 0xfe,
+0xe7, 0xe7, 0x68, 0xb0, 0xbe, 0x68, 0xe7, 0xe7, 0xfe, 0xfe,
+0xdb, 0x39, 0x2f, 0xdb, 0xfe, 0xfe, 0xe7, 0xe7, 0xfe, 0xbe,
+0xaf, 0xe7, 0x68, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0x33, 0x33,
+0xdb, 0xfe, 0xfe, 0xdb, 0xe7, 0xfe, 0xb0, 0xb0, 0xfe, 0xfe,
+0xe7, 0xfe, 0xfe, 0xfe, 0x35, 0x33, 0xe7, 0xe7, 0xfe, 0xe7,
+0xe7, 0xfe, 0xb0, 0xb2, 0xb0, 0xfe, 0xfe, 0xe7, 0xfe, 0xe7,
+0x46, 0x35, 0x35, 0x3f, 0xe7, 0xfe, 0xe7, 0xfe, 0xb2, 0xb0,
+0xb2, 0xb0, 0xfe, 0xfe, 0xfe, 0xfe, 0x42, 0x35, 0x37, 0x33,
+0xe7, 0xfe, 0xfe, 0xfe, 0xb8, 0xb0, 0xb6, 0xb0, 0xba, 0xfe,
+0xfe, 0xe7, 0xe7, 0x33, 0x39, 0x39, 0x33, 0xe7, 0xdb, 0xfe,
+0xe7, 0xb0, 0xb4, 0xb6, 0xb0, 0xcd, 0xfe, 0xe7, 0xe7, 0x33,
+0x39, 0x3b, 0x33, 0x46, 0xd3, 0xfe, 0xfe, 0xb0, 0xb2, 0xb6,
+0xb4, 0xb0, 0xfe, 0xfe, 0xdb, 0x35, 0x37, 0x39, 0x39, 0x35,
+0x37, 0xdb, 0x68, 0xcd, 0xb2, 0xb6, 0xb6, 0xb4, 0xb4, 0x68,
+0xe7, 0x42, 0x37, 0x3b, 0x3b, 0x39, 0x37, 0xdb, 0xfe, 0xcd,
+0xb2, 0xb6, 0xb6, 0xb6, 0xb2, 0xb4, 0xfe, 0x54, 0x37, 0x3b,
+0x39, 0x3b, 0x3b, 0x39, 0xe7, 0xfe, 0xb6, 0xb6, 0xb6, 0xb4,
+0xb6, 0xb6, 0xbc, 0xfe, 0x3f, 0x3b, 0x3b, 0x39, 0x3b, 0x3b,
+0x39, 0xe7, 0xb6, 0xb8, 0xb8, 0xb6, 0xb8, 0xb8, 0xb4, 0xfe,
+0x3b, 0x3d, 0x3d, 0x3b, 0x39, 0x3d, 0x3b, 0x39, 0xbe, 0xb8,
+0xba, 0xb8, 0xb6, 0xb8, 0xba, 0xb4, 0xfe, 0x39, 0x3f, 0x3d,
+0x3b, 0x3d, 0x3f, 0x39, 0xdb, 0xb4, 0xba, 0xb8, 0xb6, 0xb8,
+0xbc, 0xb4, 0xba, 0x39, 0x42, 0x3f, 0x3d, 0x3d, 0x3f, 0x3f,
+0x3b, 0xb8, 0xb6, 0xbc, 0xb8, 0xb8, 0xba, 0xbc, 0xb8, 0xe7,
+0x3d, 0x42, 0x3f, 0x3d, 0x3f, 0x42, 0x3d, 0xfe, 0xb8, 0xbc,
+0xbc, 0xba, 0xba, 0xbc, 0xba, 0xe7, 0x3d, 0x3f, 0x42, 0x3f,
+0x3f, 0x42, 0x42, 0xfe, 0xfe, 0xbc, 0xbc, 0xbe, 0xbc, 0xbe,
+0xbc, 0xc5, 0xe7, 0x68, 0x42, 0x46, 0x42, 0x46, 0x42, 0x46,
+0xfe, 0xfe, 0xbc, 0xbe, 0xbe, 0xbe, 0xbc, 0xc5, 0xfe, 0xdb,
+0x46, 0x46, 0x4a, 0x4a, 0x46, 0x46, 0xe7, 0xfe, 0xd3, 0xbe,
+0xc9, 0xc9, 0xc5, 0xc5, 0xe7, 0xdb, 0xd3, 0x4a, 0x4e, 0x54,
+0x4e, 0x4e, 0xfe, 0x5c, 0x54, 0xd3, 0xcd, 0xd3, 0xd3, 0xcd,
+0xd3, 0xd3, 0xcd, 0xfe, 0x5c, 0x68, 0x5c, 0x5c, 0x5c, 0x68,
+0x5c, 0x5c, 0xcd, 0xcd, 0xd3, 0xcd, 0xdb, 0xe7, 0xe7, 0xdb,
+0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xe7,
+0xfe, 0x5c, 0x5c, 0xfe, 0xfe, 0xfe, 0xfe, 0x46, 0x35, 0x35,
+0x37, 0x39, 0x3b, 0x39, 0x35, 0x33, 0x35, 0x5c, 0xd3, 0xcd,
+0xdb, 0xfe, 0xfe, 0xd3, 0xb0, 0xb0, 0xb0, 0xb4, 0xb4, 0xb6,
+0xb2, 0xb0, 0xb0, 0xb6, 0xcd, 0x5c, 0x68, 0xfe, 0xfe, 0xfe,
+0x3b, 0x33, 0x35, 0x37, 0x39, 0x3b, 0x39, 0x37, 0x35, 0x35,
+0x3f, 0xdb, 0xcd, 0xcd, 0xdb, 0xfe, 0xe7, 0xc5, 0xb0, 0xb0,
+0xb2, 0xb6, 0xb6, 0xb6, 0xb2, 0xb0, 0xb0, 0xcd, 0x5c, 0x5c,
+0xfe, 0xe7, 0xe7, 0xfe, 0x35, 0x35, 0x35, 0x39, 0x3b, 0x3b,
+0x39, 0x35, 0x33, 0x39, 0xdb, 0xcd, 0xd3, 0xe7, 0xfe, 0xfe,
+0xba, 0xb0, 0xb0, 0xb2, 0xb4, 0xb6, 0xb6, 0xb4, 0xb2, 0xb0,
+0xb4, 0xc9, 0x5c, 0x68, 0xfe, 0xfe, 0x5c, 0x3b, 0x35, 0x37,
+0x39, 0x3b, 0x3b, 0x3b, 0x39, 0x37, 0x37, 0x3d, 0xe7, 0xcd,
+0xdb, 0xfe, 0xe7, 0xbe, 0xb2, 0xb2, 0xb4, 0xb4, 0xb6, 0xb6,
+0xb6, 0xb4, 0xb0, 0xb0, 0xc5, 0x5c, 0x5c, 0xfe, 0xe7, 0xe7,
+0x4e, 0x35, 0x35, 0x37, 0x3b, 0x3b, 0x3b, 0x39, 0x37, 0x37,
+0x3b, 0xe7, 0xc9, 0xcd, 0xe7, 0xfe, 0xd3, 0xb4, 0xb2, 0xb2,
+0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2, 0xb4, 0xc1, 0x68,
+0x68, 0xfe, 0xfe, 0x42, 0x39, 0x37, 0x39, 0x3b, 0x3b, 0x3b,
+0x3b, 0x3b, 0x39, 0x37, 0x3b, 0xfe, 0xd3, 0xdb, 0xfe, 0xcd,
+0xb4, 0xb2, 0xb4, 0xb4, 0xb6, 0xb6, 0xb6, 0xb6, 0xb4, 0xb2,
+0xb2, 0xc1, 0x5c, 0x5c, 0xfe, 0xfe, 0xfe, 0x3d, 0x37, 0x37,
+0x39, 0x3b, 0x3b, 0x3b, 0x3b, 0x37, 0x37, 0x39, 0xfe, 0xcd,
+0xd3, 0xfe, 0xfe, 0xc1, 0xb2, 0xb2, 0xb4, 0xb6, 0xb6, 0xb6,
+0xb6, 0xb6, 0xb6, 0xb4, 0xb4, 0xbc, 0x68, 0xfe, 0xfe, 0xfe,
+0x3b, 0x39, 0x39, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x39,
+0x39, 0x3b, 0xfe, 0xdb, 0xe7, 0xfe, 0xbc, 0xb6, 0xb6, 0xb6,
+0xb8, 0xb6, 0xb6, 0xb6, 0xb8, 0xb6, 0xb4, 0xb4, 0xbc, 0xfe,
+0x68, 0xfe, 0xe7, 0x5c, 0x3b, 0x39, 0x39, 0x3b, 0x3b, 0x3b,
+0x3d, 0x3d, 0x3b, 0x39, 0x3b, 0x68, 0xdb, 0xdb, 0xfe, 0xe7,
+0xb8, 0xb6, 0xb6, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb6,
+0xb4, 0xb6, 0xdb, 0x68, 0xfe, 0xfe, 0x46, 0x3b, 0x3b, 0x3b,
+0x3d, 0x3d, 0x3b, 0x3d, 0x3d, 0x3d, 0x3d, 0x3b, 0x3b, 0x5c,
+0xdb, 0xdb, 0xc9, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xb8,
+0xb8, 0xb8, 0xb8, 0xb8, 0xb8, 0xbc, 0xcd, 0xfe, 0xfe, 0x3d,
+0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3b, 0x3d, 0x3d, 0x3d, 0x3d,
+0x3b, 0x3d, 0x46, 0xfe, 0xe7, 0xe7, 0xc5, 0xb8, 0xb8, 0xb8,
+0xba, 0xba, 0xb8, 0xb8, 0xba, 0xba, 0xb8, 0xb8, 0xb8, 0xcd,
+0xfe, 0xfe, 0x68, 0x3f, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d,
+0x3d, 0x3d, 0x3f, 0x3f, 0x3d, 0x3b, 0x4a, 0xfe, 0xdb, 0xbc,
+0xb8, 0xba, 0xba, 0xba, 0xba, 0xb8, 0xb8, 0xb8, 0xba, 0xba,
+0xba, 0xba, 0xba, 0xc5, 0xfe, 0x54, 0x3f, 0x3f, 0x3f, 0x3f,
+0x3f, 0x3f, 0x3d, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x42,
+0xfe, 0xe7, 0xdb, 0xbc, 0xba, 0xba, 0xba, 0xba, 0xba, 0xba,
+0xba, 0xba, 0xbc, 0xba, 0xba, 0xba, 0xc5, 0xfe, 0xfe, 0x4e,
+0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x42,
+0x42, 0x42, 0x3f, 0x46, 0xfe, 0xcd, 0xb8, 0xba, 0xbc, 0xbc,
+0xbc, 0xba, 0xba, 0xba, 0xba, 0xbc, 0xbc, 0xbc, 0xba, 0xb8,
+0xbe, 0xfe, 0x42, 0x3d, 0x3f, 0x42, 0x42, 0x42, 0x3f, 0x3f,
+0x3f, 0x42, 0x42, 0x42, 0x42, 0x3f, 0x3f, 0x68, 0xdb, 0xc5,
+0xba, 0xbc, 0xbc, 0xbc, 0xbc, 0xba, 0xba, 0xba, 0xbc, 0xbc,
+0xbc, 0xbc, 0xba, 0xc1, 0xfe, 0xfe, 0x3f, 0x42, 0x46, 0x46,
+0x46, 0x42, 0x42, 0x42, 0x42, 0x42, 0x46, 0x46, 0x42, 0x3f,
+0x42, 0x68, 0xbe, 0xba, 0xbc, 0xbe, 0xbe, 0xbe, 0xbc, 0xbc,
+0xbc, 0xbc, 0xbe, 0xc1, 0xbe, 0xbc, 0xba, 0xbe, 0x68, 0x3f,
+0x42, 0x46, 0x4a, 0x4a, 0x46, 0x42, 0x42, 0x42, 0x46, 0x46,
+0x46, 0x46, 0x42, 0x42, 0x68, 0xd3, 0xbc, 0xbc, 0xbe, 0xc1,
+0xc1, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1, 0xc1, 0xbe, 0xbe,
+0xc1, 0xfe, 0x4e, 0x42, 0x46, 0x4a, 0x4a, 0x4a, 0x46, 0x46,
+0x46, 0x46, 0x4a, 0x4a, 0x4a, 0x46, 0x46, 0x68, 0xdb, 0xbe,
+0xbe, 0xc1, 0xc5, 0xc1, 0xc1, 0xbe, 0xbe, 0xbe, 0xbe, 0xc1,
+0xc5, 0xc5, 0xbe, 0xbc, 0xc1, 0x4e, 0x46, 0x46, 0x4a, 0x4e,
+0x4e, 0x4a, 0x46, 0x46, 0x46, 0x4a, 0x4a, 0x4e, 0x4a, 0x46,
+0x46, 0xfe, 0xbe, 0xbe, 0xc1, 0xc9, 0xc5, 0xc5, 0xc1, 0xc1,
+0xc1, 0xc1, 0xc5, 0xc5, 0xc5, 0xc5, 0xbe, 0xc1, 0xfe, 0x4a,
+0x4a, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4a, 0x4a, 0x4a, 0x4e,
+0x54, 0x4e, 0x4a, 0x4a, 0x4e, 0xcd, 0xc1, 0xc5, 0xc5, 0xc9,
+0xc5, 0xc5, 0xc5, 0xc5, 0xc9, 0xcd, 0xcd, 0xcd, 0xcd, 0xc9,
+0xc9, 0xd3, 0x68, 0x54, 0x5c, 0x68, 0x68, 0x68, 0x5c, 0x5c,
+0x5c, 0x5c, 0x5c, 0x68, 0x68, 0x5c, 0x54, 0x5c, 0xdb, 0xcd,
+0xcd, 0xdb, 0xdb, 0xdb, 0xdb, 0xd3, 0xd3, 0xe7, 0xe7, 0xe7,
+0xe7, 0xe7, 0xe7, 0xe7, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xe7, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
+0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe };
AC_DEFINE([HAVE_$1], 1, [Define if your system has the $1 headers.])
m4_ifval([$4], [AC_DEFINE([HAVE_$1_VERSION], $4, [Define $1 headers version])])
],
- [ AC_MSG_RESULT(no) ]
+ [ AC_MSG_RESULT(no) ]
)
CPPFLAGS="${saved_cppflags}"
fi
AC_DEFINE([HAVE_$1], 1, [Define if your system has $2 declared.])
m4_ifval([$4], [AC_DEFINE([HAVE_$1_VERSION], $4, [Define $1 headers version])])
],
- [ AC_MSG_RESULT(no) ]
+ [ AC_MSG_RESULT(no) ]
)
CPPFLAGS="${saved_cppflags}"
AC_DEFINE([HAVE_$1], 1, [Define if your system has the $1 headers.])
m4_ifval([$4], [AC_DEFINE([HAVE_$1_VERSION], $4, [Define $1 headers version])])
],
- [ AC_MSG_RESULT(no) ]
+ [ AC_MSG_RESULT(no) ]
)
CPPFLAGS="${saved_cppflags}"
fi
-dnl
+dnl
dnl @synopsis AST_CHECK_OSPTK([REQ_VER_MAJOR],[REQ_VER_MINOR],[REQ_VER_BUGFIX])
dnl
dnl @summary check for existence of OSP Toolkit package
fi
fi
])
-
AC_LINK_IFELSE(
[AC_LANG_PROGRAM([$4],[$5])],
- [ AC_MSG_RESULT(yes)
- ac_cv_lib_$2="yes"
+ [ AC_MSG_RESULT(yes)
+ ac_cv_lib_$2="yes"
],
- [ AC_MSG_RESULT(no)
- ac_cv_lib_$2="no"
+ [ AC_MSG_RESULT(no)
+ ac_cv_lib_$2="no"
]
)
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for bridging modules
#
# Copyright (C) 2005-2007, Digium, Inc.
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Holding bridge module");
-
cat << END
/*
- * buildopts.h
+ * buildopts.h
* Automatically generated
*/
#!/bin/sh
cat << END
/*
- * defaults.h
+ * defaults.h
* Automatically generated from build options,
* only used in main/asterisk.c
*/
[ ! -f "${1}/sounds${lang}vm-isunavail.${format}" ] && continue
mkdir -p "${2}/voicemail/default/1234${lang}"
-
+
: > "${2}/voicemail/default/1234${lang}unavail.${format}"
-
+
for file in vm-theperson digits/1 digits/2 digits/3 digits/4 vm-isunavail
do
cat "${1}/sounds${lang}${file}.${format}" >> "${2}/voicemail/default/1234${lang}unavail.${format}"
done
: > "${2}/voicemail/default/1234${lang}busy.${format}"
-
+
for file in vm-theperson digits/1 digits/2 digits/3 digits/4 vm-isonphone
do
cat "${1}/sounds${lang}${file}.${format}" >> "${2}/voicemail/default/1234${lang}busy.${format}"
if [ -z ${GIT} ]; then
GIT="git"
fi
-
+
if ! command -v ${GIT} >/dev/null 2>&1; then
echo "UNKNOWN__and_probably_unsupported"
exit 1
fi
- cd ${1}
-
+ cd ${1}
+
# If the first log commit messages indicates that this is checked into
# subversion, we'll just use the SVN- form of the revision.
MODIFIED=""
.reload = reload,
.load_pri = AST_MODPRI_CDR_DRIVER,
);
-
.reload = reload,
.load_pri = AST_MODPRI_CDR_DRIVER,
);
-
}
/* Setting Acct-Session-Id & User-Name attributes for proper generation
- * of Acct-Unique-Session-Id on server side
+ * of Acct-Unique-Session-Id on server side
*/
/* Channel */
if (!rc_avpair_add(rh, tosend, PW_USER_NAME, &cdr->channel, strlen(cdr->channel), 0))
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for CEL backends
#
# Copyright (C) 1999-2008, Digium, Inc.
.reload = reload,
.load_pri = AST_MODPRI_CDR_DRIVER,
);
-
free_config();
AST_RWLIST_UNLOCK(&odbc_tables);
AST_RWLIST_HEAD_DESTROY(&odbc_tables);
-
+
return 0;
}
.reload = reload,
.load_pri = AST_MODPRI_CDR_DRIVER,
);
-
chan_usbradio.so: LIBS+=-lusb -lasound
chan_usbradio.so: _ASTCFLAGS+=-DNDEBUG
-
* at the top of the source tree.
*/
-/*! \file
- * \brief ALSA sound card channel driver
+/*! \file
+ * \brief ALSA sound card channel driver
*
* \author Matthew Fredrickson <creslin@digium.com>
*
} alsa;
/* Number of buffers... Each is FRAMESIZE/8 ms long. For example
- with 160 sample frames, and a buffer size of 3, we have a 60ms buffer,
+ with 160 sample frames, and a buffer size of 3, we have a 60ms buffer,
usually plenty. */
#define MAX_BUFFER_SIZE 100
static int alsa_digit(struct ast_channel *c, char digit, unsigned int duration)
{
ast_mutex_lock(&alsalock);
- ast_verbose(" << Console Received digit %c of duration %u ms >> \n",
+ ast_verbose(" << Console Received digit %c of duration %u ms >> \n",
digit, duration);
ast_mutex_unlock(&alsalock);
return NULL;
case CLI_GENERATE:
- return NULL;
+ return NULL;
}
if (a->argc != 2)
" Sends a text message for display on the remote terminal.\n";
return NULL;
case CLI_GENERATE:
- return NULL;
+ return NULL;
}
if (a->argc < 3)
" Hangs up any call currently placed on the console.\n";
return NULL;
case CLI_GENERATE:
- return NULL;
+ return NULL;
}
-
+
if (a->argc != 2)
return CLI_SHOWUSAGE;
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* at the top of the source tree.
*/
-/*!
- * \file
- * \brief Cross-platform console channel driver
+/*!
+ * \file
+ * \brief Cross-platform console channel driver
*
* \author Russell Bryant <russell@digium.com>
*
* chan_oss, Mark Spencer <markster@digium.com>
* chan_oss, Luigi Rizzo
* chan_alsa, Matthew Fredrickson <creslin@digium.com>
- *
+ *
* \ingroup channel_drivers
*
* Portaudio http://www.portaudio.com/
#include "asterisk/stasis_channels.h"
#include "asterisk/format_cache.h"
-/*!
- * \brief The sample rate to request from PortAudio
+/*!
+ * \brief The sample rate to request from PortAudio
*
* \todo Make this optional. If this is only going to talk to 8 kHz endpoints,
* then it makes sense to use 8 kHz natively.
*/
#define SAMPLE_RATE 16000
-/*!
+/*!
* \brief The number of samples to configure the portaudio stream for
*
* 320 samples (20 ms) is the most common frame size in Asterisk. So, the code
/*! \brief Mono Output */
#define OUTPUT_CHANNELS 1
-/*!
+/*!
* \brief Maximum text message length
* \note This should be changed if there is a common definition somewhere
* that defines the maximum length of a text message.
static struct console_pvt *active_pvt;
AST_RWLOCK_DEFINE_STATIC(active_lock);
-/*!
- * \brief Global jitterbuffer configuration
+/*!
+ * \brief Global jitterbuffer configuration
*
* \note Disabled by default.
* \note Values shown here match the defaults shown in console.conf.sample
static struct ast_frame *console_read(struct ast_channel *chan);
static int console_call(struct ast_channel *c, const char *dest, int timeout);
static int console_write(struct ast_channel *chan, struct ast_frame *f);
-static int console_indicate(struct ast_channel *chan, int cond,
+static int console_indicate(struct ast_channel *chan, int cond,
const void *data, size_t datalen);
static int console_fixup(struct ast_channel *oldchan, struct ast_channel *newchan);
/*! @} */
}
/*!
- * \brief Stream monitor thread
+ * \brief Stream monitor thread
*
* \arg data A pointer to the console_pvt structure that contains the portaudio
* stream that needs to be monitored.
{
int res = paInternalError;
- if (!strcasecmp(pvt->input_device, "default") &&
+ if (!strcasecmp(pvt->input_device, "default") &&
!strcasecmp(pvt->output_device, "default")) {
- res = Pa_OpenDefaultStream(&pvt->stream, INPUT_CHANNELS, OUTPUT_CHANNELS,
+ res = Pa_OpenDefaultStream(&pvt->stream, INPUT_CHANNELS, OUTPUT_CHANNELS,
paInt16, SAMPLE_RATE, NUM_SAMPLES, NULL, NULL);
} else {
- PaStreamParameters input_params = {
+ PaStreamParameters input_params = {
.channelCount = 1,
.sampleFormat = paInt16,
.suggestedLatency = (1.0 / 50.0), /* 20 ms */
.device = paNoDevice,
};
- PaStreamParameters output_params = {
- .channelCount = 1,
+ PaStreamParameters output_params = {
+ .channelCount = 1,
.sampleFormat = paInt16,
.suggestedLatency = (1.0 / 50.0), /* 20 ms */
.device = paNoDevice,
def_input = Pa_GetDefaultInputDevice();
def_output = Pa_GetDefaultOutputDevice();
- for (idx = 0;
- idx < num_devices && (input_params.device == paNoDevice
- || output_params.device == paNoDevice);
- idx++)
+ for (idx = 0;
+ idx < num_devices && (input_params.device == paNoDevice
+ || output_params.device == paNoDevice);
+ idx++)
{
const PaDeviceInfo *dev = Pa_GetDeviceInfo(idx);
return NULL;
}
- if (!(chan = ast_channel_alloc(1, state, pvt->cid_num, pvt->cid_name, NULL,
+ if (!(chan = ast_channel_alloc(1, state, pvt->cid_num, pvt->cid_name, NULL,
ext, ctx, assignedids, requestor, 0, "Console/%s", pvt->name))) {
ao2_ref(caps, -1);
return NULL;
static int console_digit_end(struct ast_channel *c, char digit, unsigned int duration)
{
- ast_verb(1, V_BEGIN "Console Received End of Digit %c (duration %u)" V_END,
+ ast_verb(1, V_BEGIN "Console Received End of Digit %c (duration %u)" V_END,
digit, duration);
return -1; /* non-zero to request inband audio */
* Calling this function is harmless. However, if it does get called, it
* is an indication that something weird happened that really shouldn't
* have and is worth looking into.
- *
+ *
* Why should this function not get called? Well, let me explain. There are
* a couple of ways to pass on audio that has come from this channel. The way
* that this channel driver uses is that once the audio is available, it is
ast_moh_stop(chan);
break;
default:
- ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n",
+ ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n",
cond, ast_channel_name(chan));
/* The core will play inband indications for us if appropriate */
res = -1;
struct console_pvt *pvt;
ast_rwlock_rdlock(&active_lock);
- pvt = ref_pvt(active_pvt);
+ pvt = ref_pvt(active_pvt);
ast_rwlock_unlock(&active_lock);
return pvt;
}
-static char *cli_console_autoanswer(struct ast_cli_entry *e, int cmd,
+static char *cli_console_autoanswer(struct ast_cli_entry *e, int cmd,
struct ast_cli_args *a)
{
struct console_pvt *pvt;
static char *cli_console_dial(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char *s = NULL;
- const char *mye = NULL, *myc = NULL;
+ const char *mye = NULL, *myc = NULL;
struct console_pvt *pvt;
if (cmd == CLI_INIT) {
if (a->argc == e->args + 1) {
char *ext = NULL, *con = NULL;
s = ast_ext_ctx(pvt, a->argv[e->args], &ext, &con);
- ast_debug(1, "provided '%s', exten '%s' context '%s'\n",
+ ast_debug(1, "provided '%s', exten '%s' context '%s'\n",
a->argv[e->args], mye, myc);
mye = ext;
myc = con;
else
res = CLI_SHOWUSAGE;
- ast_verb(1, V_BEGIN "The Console is now %s" V_END,
+ ast_verb(1, V_BEGIN "The Console is now %s" V_END,
pvt->muted ? "Muted" : "Unmuted");
unref_pvt(pvt);
ast_string_field_set(pvt, cid_num, "");
ast_string_field_set(pvt, cid_name, "");
ast_string_field_set(pvt, parkinglot, "");
-
+
pvt->overridecontext = 0;
pvt->autoanswer = 0;
} else {
char cid_name[256];
char cid_num[256];
- ast_callerid_split(value, cid_name, sizeof(cid_name),
+ ast_callerid_split(value, cid_name, sizeof(cid_name),
cid_num, sizeof(cid_num));
ast_string_field_set(pvt, cid_name, cid_name);
ao2_link(pvts, pvt);
else
console_pvt_unlock(pvt);
-
+
unref_pvt(pvt);
}
ast_log(LOG_NOTICE, "Config file %s has an invalid format\n", config_file);
return -1;
}
-
+
ao2_callback(pvts, OBJ_NODATA, pvt_mark_destroy_cb, NULL);
ast_mutex_lock(&globals_lock);
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
if (pos == 2) {
struct ao2_iterator i = ao2_iterator_init(peers, 0);
while ((p = ao2_iterator_next(&i))) {
- if (!strncasecmp(p->name, word, wordlen) &&
+ if (!strncasecmp(p->name, word, wordlen) &&
++which > state && p->expire > -1) {
res = ast_strdup(p->name);
peer_unref(p);
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
/*! \file
*
* \brief Network broadcast sound support channel driver
- *
+ *
* \author Mark Spencer <markster@digium.com>
*
* \ingroup channel_drivers
/*** MODULEINFO
<depend>nbs</depend>
<defaultenabled>no</defaultenabled>
- <support_level>extended</support_level>
+ <support_level>extended</support_level>
***/
#include "asterisk.h"
static const char type[] = "NBS";
/* NBS creates private structures on demand */
-
+
struct nbs_pvt {
NBS *nbs;
struct ast_channel *owner; /* Channel we belong to, possibly NULL */
flags |= NBS_FLAG_OVERRIDE;
} else
flags = NBS_FLAG_OVERSPEAK;
-
+
ast_copy_string(p->stream, stream, sizeof(p->stream));
p->nbs = nbs_newstream("asterisk", stream, flags);
if (!p->nbs) {
/* Don't try tos end audio on-hook */
return 0;
}
- if (nbs_write(p->nbs, frame->data.ptr, frame->datalen / 2) < 0)
+ if (nbs_write(p->nbs, frame->data.ptr, frame->datalen / 2) < 0)
return -1;
return 0;
}
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Network Broadcast Sound Support");
-
#include <ctype.h> /* isalnum() used here */
#include <math.h>
-#include <sys/ioctl.h>
+#include <sys/ioctl.h>
#ifdef __linux
#include <linux/soundcard.h>
static int oss_digit_end(struct ast_channel *c, char digit, unsigned int duration)
{
/* no better use for received digits than print them */
- ast_verbose(" << Console Received digit %c of duration %u ms >> \n",
+ ast_verbose(" << Console Received digit %c of duration %u ms >> \n",
digit, duration);
return 0;
}
switch (cmd) {
case CLI_INIT:
e->command = CONSOLE_VIDEO_CMDS;
- e->usage =
+ e->usage =
"Usage: " CONSOLE_VIDEO_CMDS "...\n"
" Generic handler for console commands.\n";
return NULL;
struct chan_oss_pvt *o = find_desc(oss_active);
const char *s;
int toggle = 0;
-
+
if (cmd == CLI_INIT) {
e->command = "console {mute|unmute} [toggle]";
e->usage =
AST_CLI_DEFINE(console_flash, "Flash a call on the console"),
AST_CLI_DEFINE(console_dial, "Dial an extension on the console"),
AST_CLI_DEFINE(console_mute, "Disable/Enable mic input"),
- AST_CLI_DEFINE(console_transfer, "Transfer a call to a different extension"),
+ AST_CLI_DEFINE(console_transfer, "Transfer a call to a different extension"),
AST_CLI_DEFINE(console_cmd, "Generic console command"),
AST_CLI_DEFINE(console_sendtext, "Send text to the remote device"),
AST_CLI_DEFINE(console_autoanswer, "Sets/displays autoanswer"),
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "OSS Console Channel Driver");
-
* \brief Generic Linux Telephony Interface driver
*
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup channel_drivers
*/
/* Boolean value whether the monitoring thread shall continue. */
static unsigned int monitor;
-
+
/* This is the thread for the monitor which checks for input on the channels
which are not currently in use. */
static pthread_t monitor_thread = AST_PTHREADT_NULL;
/* The private structures of the Phone Jack channels are linked for
selecting outgoing channels */
-
+
#define MODE_DIALTONE 1
#define MODE_IMMEDIATE 2
#define MODE_FXO 3
start = IXJ_PHONE_RING_START(cid);
if (start == -1)
return -1;
-
+
if (p->mode == MODE_FXS) {
const char *digit = strchr(dest, '/');
if (digit)
phone_digit_end(ast, *digit++, 0);
}
}
-
+
ast_setstate(ast, AST_STATE_RINGING);
ast_queue_control(ast, AST_CONTROL_RINGING);
return 0;
if (!p->lastinput || (ast_format_cmp(p->lastinput, ast_channel_rawreadformat(ast)) == AST_FORMAT_CMP_NOT_EQUAL)) {
ao2_replace(p->lastinput, ast_channel_rawreadformat(ast));
if (ioctl(p->fd, PHONE_REC_CODEC, ast_channel_rawreadformat(ast))) {
- ast_log(LOG_WARNING, "Failed to set codec to %s\n",
+ ast_log(LOG_WARNING, "Failed to set codec to %s\n",
ast_format_get_name(ast_channel_rawreadformat(ast)));
return -1;
}
p->fr.offset = 0;
p->fr.mallocd=0;
p->fr.delivery = ast_tv(0,0);
-
+
phonee.bytes = ioctl(p->fd, PHONE_EXCEPTION);
if (phonee.bits.dtmf_ready) {
ast_debug(1, "phone_exception(): DTMF\n");
-
+
/* We've got a digit -- Just handle this nicely and easily */
digit = ioctl(p->fd, PHONE_GET_DTMF_ASCII);
p->fr.subclass.integer = digit;
phone_setup(ast);
ast_setstate(ast, AST_STATE_UP);
return &p->fr;
- } else
+ } else
ast_log(LOG_WARNING, "Got off hook in weird state %u\n", ast_channel_state(ast));
}
}
{
int res;
struct phone_pvt *p = ast_channel_tech_pvt(ast);
-
+
/* Some nice norms */
p->fr.datalen = 0;
}
p->obuflen -= frlen;
/* Move memory if necessary */
- if (p->obuflen)
+ if (p->obuflen)
memmove(p->obuf, p->obuf + frlen, p->obuflen);
}
return len;
static int phone_send_text(struct ast_channel *ast, const char *text)
{
int length = strlen(text);
- return phone_write_buf(ast_channel_tech_pvt(ast), text, length, length, 0) ==
+ return phone_write_buf(ast_channel_tech_pvt(ast), text, length, length, 0) ==
length ? 0 : -1;
}
/* Don't try tos end audio on-hook */
return 0;
}
-#endif
+#endif
if (ast_format_cmp(frame->subclass.format, ast_format_g729) == AST_FORMAT_CMP_EQUAL) {
if (!p->lastformat || (ast_format_cmp(p->lastformat, ast_format_g729) != AST_FORMAT_CMP_EQUAL)) {
ioctl(p->fd, PHONE_PLAY_STOP);
expected = frame->datalen - sofar;
if (maxfr < expected)
expected = maxfr;
- /* XXX Internet Phone Jack does not handle the 4-byte VAD frame properly! XXX
+ /* XXX Internet Phone Jack does not handle the 4-byte VAD frame properly! XXX
we have to pad it to 24 bytes still. */
if (frame->datalen == 4) {
if (p->silencesupression) {
}
if (res != expected) {
if ((errno != EAGAIN) && (errno != EINTR)) {
- if (res < 0)
+ if (res < 0)
ast_log(LOG_WARNING, "Write returned error (%s)\n", strerror(errno));
/*
* Card is in non-blocking mode now and it works well now, but there are
}
if (phonee.bits.caller_id)
ast_verbose("We have caller ID\n");
-
-
+
+
}
static void *do_monitor(void *data)
{
/* Make a phone_pvt structure for this interface */
struct phone_pvt *tmp;
- int flags;
-
+ int flags;
+
tmp = ast_calloc(1, sizeof(*tmp));
if (tmp) {
tmp->fd = open(iface, O_RDWR);
ast_debug(1, "Unable to set port to PSTN\n");
}
} else {
- if (ioctl(tmp->fd, IXJCTL_PORT, PORT_POTS))
+ if (ioctl(tmp->fd, IXJCTL_PORT, PORT_POTS))
if (mode != MODE_FXS)
ast_debug(1, "Unable to set port to POTS\n");
}
ast_debug(1, "ioctl(PHONE_PSTN_SET_STATE) failed on %s (%s)\n",iface, strerror(errno));
if (echocancel != AEC_OFF)
ioctl(tmp->fd, IXJCTL_AEC_START, echocancel);
- if (silencesupression)
+ if (silencesupression)
tmp->silencesupression = 1;
#ifdef PHONE_VAD
ioctl(tmp->fd, PHONE_VAD, tmp->silencesupression);
return DEFAULT_GAIN;
}
- /* multiplicate gain by 1.0 gain value */
+ /* multiplicate gain by 1.0 gain value */
gain = gain * (float)DEFAULT_GAIN;
/* percentage? */
if (tmp) {
tmp->next = iflist;
iflist = tmp;
-
+
} else {
ast_log(LOG_ERROR, "Unable to register channel '%s'\n", v->value);
ast_config_destroy(cfg);
} else if (!strcasecmp(v->name, "callerid")) {
ast_callerid_split(v->value, cid_name, sizeof(cid_name), cid_num, sizeof(cid_num));
} else if (!strcasecmp(v->name, "mode")) {
- if (!strncasecmp(v->value, "di", 2))
+ if (!strncasecmp(v->value, "di", 2))
mode = MODE_DIALTONE;
else if (!strncasecmp(v->value, "sig", 3))
mode = MODE_SIGMA;
echocancel = AEC_MED;
} else if (!strcasecmp(v->value, "high")) {
echocancel = AEC_HIGH;
- } else
+ } else
ast_log(LOG_WARNING, "Unknown echo cancellation '%s'\n", v->value);
} else if (!strcasecmp(v->name, "txgain")) {
txgain = parse_gain_value(v->name, v->value);
} else if (!strcasecmp(v->name, "rxgain")) {
rxgain = parse_gain_value(v->name, v->value);
- }
+ }
v = v->next;
}
ast_mutex_unlock(&iflock);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Linux Telephony API Support");
-
*/
static unsigned char DialTone[] = {
-0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
-0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
-0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
-0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
-0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
-0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
-0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
-0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
-0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
-0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
-0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
-0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
-0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
-0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
-0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
-0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
-0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
-0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
-0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
-0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
-0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
-0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
-0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
-0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
-0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
-0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
-0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
-0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
-0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
-0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
-0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
-0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
-0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
-0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
-0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
-0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
-0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
-0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
-0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
-0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
-0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
-0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
-0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
-0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
-0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
-0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
-0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
-0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
-0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
-0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
-0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
-0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
-0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
-0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
-0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
-0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
-0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
-0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
-0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
-0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
-0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
-0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
-0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
-0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
-0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
-0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
-0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
-0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
-0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
-0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
-0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
-0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
-0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
-0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
-0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
-0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
-0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
-0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
-0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
-0x59, 0x2a, 0x1c, 0x16, 0x11, 0x10, 0x11, 0x16, 0x1d, 0x2b,
-0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
-0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
-0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
-0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
-0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
-0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
-0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
-0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
-0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
-0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
-0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
-0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
-0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
-0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
-0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
-0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
-0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
-0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
-0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
-0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
-0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
-0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
-0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
-0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
-0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
-0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
-0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
-0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
-0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
-0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
-0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
-0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
-0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
-0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
-0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
-0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
-0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
-0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
-0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
-0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
-0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
-0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
-0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
-0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
-0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
-0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
-0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
-0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
-0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
-0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
-0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
-0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
-0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
-0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
-0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
-0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
-0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
-0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
-0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
-0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
-0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
-0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
-0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
-0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
-0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
-0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
-0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
-0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
-0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
-0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
-0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
-0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
-0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
-0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
-0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
-0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
-0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
-0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
-0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
-0x59, 0x2a, 0x1c, 0x16, 0x11, 0x10, 0x11, 0x16, 0x1d, 0x2b,
-0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
-0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
-0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
-0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
-0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
-0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
-0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
-0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
-0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
-0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
-0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
-0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
-0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
-0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
-0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
-0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
-0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
-0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
-0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
-0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
-0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
-0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
-0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
-0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
-0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
-0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
-0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
-0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
-0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
-0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
-0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
-0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
-0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
-0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
-0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
-0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
-0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
-0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
-0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
-0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
-0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
-0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
-0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
-0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
-0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
-0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
-0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
-0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
-0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
-0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
-0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
-0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
-0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
-0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
-0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
-0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
-0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
-0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
-0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
-0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
-0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
-0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
-0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
-0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
-0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
-0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
-0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
-0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
-0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
-0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
-0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
-0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
-0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
-0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
-0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
-0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
-0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
-0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
-0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
+0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
+0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
+0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
+0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
+0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
+0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
+0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
+0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
+0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
+0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
+0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
+0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
+0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
+0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
+0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
+0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
+0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
+0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
+0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
+0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
+0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
+0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
+0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
+0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
+0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
+0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
+0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
+0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
+0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
+0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
+0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
+0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
+0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
+0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
+0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
+0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
+0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
+0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
+0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
+0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
+0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
+0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
+0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
+0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
+0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
+0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
+0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
+0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
+0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
+0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
+0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
+0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
+0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
+0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
+0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
+0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
+0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
+0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
+0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
+0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
+0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
+0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
+0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
+0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
+0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
+0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
+0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
+0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
+0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
+0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
+0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
+0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
+0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
+0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
+0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
+0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
+0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
+0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
+0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
+0x59, 0x2a, 0x1c, 0x16, 0x11, 0x10, 0x11, 0x16, 0x1d, 0x2b,
+0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
+0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
+0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
+0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
+0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
+0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
+0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
+0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
+0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
+0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
+0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
+0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
+0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
+0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
+0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
+0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
+0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
+0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
+0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
+0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
+0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
+0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
+0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
+0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
+0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
+0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
+0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
+0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
+0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
+0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
+0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
+0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
+0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
+0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
+0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
+0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
+0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
+0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
+0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
+0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
+0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
+0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
+0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
+0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
+0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
+0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
+0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
+0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
+0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
+0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
+0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
+0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
+0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
+0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
+0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
+0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
+0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
+0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
+0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
+0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
+0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
+0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
+0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
+0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
+0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
+0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
+0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
+0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
+0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
+0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
+0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
+0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
+0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
+0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
+0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
+0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
+0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
+0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
+0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
+0x59, 0x2a, 0x1c, 0x16, 0x11, 0x10, 0x11, 0x16, 0x1d, 0x2b,
+0xff, 0xab, 0x9d, 0x96, 0x91, 0x90, 0x91, 0x96, 0x9c, 0xaa,
+0xd9, 0x2f, 0x1f, 0x19, 0x15, 0x14, 0x15, 0x19, 0x1f, 0x2c,
+0x4e, 0xb9, 0xa7, 0x9f, 0x9c, 0x9b, 0x9c, 0x9f, 0xa7, 0xb3,
+0xcf, 0x47, 0x34, 0x2d, 0x2a, 0x2a, 0x2c, 0x31, 0x3a, 0x47,
+0x5f, 0xe4, 0xd8, 0xd9, 0xe9, 0x64, 0x4f, 0x49, 0x46, 0x49,
+0x58, 0xde, 0xc2, 0xb5, 0xad, 0xa8, 0xa6, 0xa6, 0xa9, 0xaf,
+0xbf, 0x56, 0x32, 0x26, 0x1e, 0x1b, 0x19, 0x1a, 0x1d, 0x24,
+0x33, 0xdd, 0xad, 0x9f, 0x98, 0x94, 0x92, 0x93, 0x97, 0x9e,
+0xac, 0xf8, 0x2c, 0x1d, 0x16, 0x11, 0xf, 0x10, 0x15, 0x1b,
+0x29, 0x55, 0xae, 0x9e, 0x97, 0x92, 0x90, 0x91, 0x95, 0x9c,
+0xa8, 0xca, 0x35, 0x22, 0x1a, 0x16, 0x15, 0x16, 0x19, 0x1f,
+0x2b, 0x47, 0xbe, 0xab, 0xa2, 0x9e, 0x9d, 0x9e, 0xa2, 0xa9,
+0xb4, 0xcc, 0x4f, 0x3a, 0x32, 0x2f, 0x2f, 0x32, 0x39, 0x41,
+0x4f, 0x67, 0xf5, 0xf5, 0x67, 0x51, 0x46, 0x3e, 0x3b, 0x3b,
+0x3f, 0x4d, 0xe2, 0xbe, 0xb0, 0xa9, 0xa4, 0xa1, 0xa1, 0xa5,
+0xab, 0xba, 0x64, 0x33, 0x25, 0x1d, 0x19, 0x17, 0x18, 0x1b,
+0x20, 0x2e, 0x72, 0xae, 0x9f, 0x98, 0x94, 0x91, 0x92, 0x96,
+0x9c, 0xa9, 0xd4, 0x2f, 0x1e, 0x17, 0x11, 0xf, 0x10, 0x14,
+0x1a, 0x26, 0x48, 0xb2, 0x9f, 0x98, 0x93, 0x91, 0x92, 0x95,
+0x9b, 0xa7, 0xc1, 0x3a, 0x25, 0x1c, 0x18, 0x16, 0x17, 0x1a,
+0x1f, 0x2b, 0x42, 0xc6, 0xae, 0xa6, 0xa0, 0x9f, 0xa0, 0xa5,
+0xab, 0xb6, 0xcb, 0x5a, 0x40, 0x39, 0x36, 0x37, 0x3b, 0x43,
+0x4e, 0x60, 0x7b, 0x7c, 0x60, 0x4e, 0x41, 0x3a, 0x34, 0x32,
+0x33, 0x39, 0x45, 0xed, 0xbd, 0xae, 0xa6, 0xa0, 0x9e, 0x9e,
+0xa0, 0xa8, 0xb4, 0xef, 0x34, 0x24, 0x1c, 0x18, 0x16, 0x16,
+0x19, 0x1e, 0x2b, 0x54, 0xb1, 0x9f, 0x98, 0x93, 0x91, 0x91,
+0x95, 0x9b, 0xa6, 0xc6, 0x33, 0x1f, 0x17, 0x12, 0xf, 0x10,
+0x13, 0x1a, 0x24, 0x3e, 0xb8, 0xa2, 0x99, 0x94, 0x92, 0x92,
+0x96, 0x9b, 0xa6, 0xbc, 0x40, 0x29, 0x1e, 0x1a, 0x18, 0x19,
+0x1b, 0x20, 0x2b, 0x3f, 0xcf, 0xb3, 0xa9, 0xa5, 0xa3, 0xa4,
+0xa8, 0xae, 0xb9, 0xcc, 0x67, 0x49, 0x40, 0x3f, 0x42, 0x4a,
+0x59, 0x79, 0xe5, 0xe4, 0x7a, 0x54, 0x43, 0x39, 0x31, 0x2d,
+0x2c, 0x2d, 0x32, 0x3e, 0x71, 0xbd, 0xad, 0xa4, 0x9e, 0x9c,
+0x9c, 0x9e, 0xa4, 0xaf, 0xd7, 0x36, 0x24, 0x1c, 0x17, 0x15,
+0x15, 0x17, 0x1d, 0x28, 0x47, 0xb5, 0xa1, 0x98, 0x93, 0x90,
+0x90, 0x93, 0x99, 0xa4, 0xbd, 0x38, 0x21, 0x18, 0x13, 0x10,
+0x10, 0x13, 0x19, 0x22, 0x39, 0xbe, 0xa5, 0x9b, 0x96, 0x93,
+0x93, 0x96, 0x9b, 0xa5, 0xb9, 0x4a, 0x2c, 0x20, 0x1c, 0x1a,
+0x1a, 0x1d, 0x22, 0x2c, 0x3d, 0xdc, 0xb8, 0xad, 0xa9, 0xa8,
+0xa9, 0xac, 0xb2, 0xbd, 0xce, 0x78, 0x54, 0x4d, 0x4f, 0x5a,
+0xff, 0xda, 0xcf, 0xcd, 0xd4, 0xf8, 0x4e, 0x3d, 0x32, 0x2c,
+0x29, 0x28, 0x29, 0x2d, 0x38, 0x5c, 0xbd, 0xac, 0xa2, 0x9d,
+0x9a, 0x9a, 0x9c, 0xa0, 0xac, 0xca, 0x39, 0x25, 0x1b, 0x16,
+0x13, 0x13, 0x16, 0x1b, 0x25, 0x3e, 0xb9, 0xa2, 0x99, 0x93,
+0x90, 0x90, 0x93, 0x98, 0xa1, 0xb8, 0x3d, 0x24, 0x19, 0x13,
+0x10, 0x10, 0x13, 0x18, 0x21, 0x35, 0xc7, 0xa8, 0x9d, 0x97,
+0x95, 0x95, 0x97, 0x9c, 0xa4, 0xb6, 0x57, 0x2f, 0x24, 0x1e,
+0x1c, 0x1c, 0x1e, 0x24, 0x2d, 0x3d, 0xf1, 0xbe, 0xb2, 0xad,
+0xac, 0xad, 0xb1, 0xb9, 0xc3, 0xd4, 0xfa, 0x64, 0x65, 0xf9,
+0xd9, 0xca, 0xc2, 0xbf, 0xc0, 0xc9, 0xe7, 0x4c, 0x39, 0x2e,
+0x28, 0x24, 0x23, 0x25, 0x29, 0x33, 0x4f, 0xbf, 0xab, 0xa0,
+0x9b, 0x99, 0x98, 0x9a, 0x9e, 0xa9, 0xc0, 0x3c, 0x26, 0x1b,
+0x16, 0x12, 0x12, 0x14, 0x19, 0x22, 0x38, 0xbe, 0xa4, 0x9a,
+0x93, 0x90, 0x8f, 0x92, 0x97, 0x9f, 0xb3, 0x46, 0x26, 0x1b,
+0x15, 0x11, 0x11, 0x13, 0x18, 0x1f, 0x31, 0xd4, 0xab, 0x9e,
+0x99, 0x96, 0x96, 0x98, 0x9c, 0xa4, 0xb4, 0x6f, 0x34, 0x28,
+0x20, 0x1e, 0x1e, 0x20, 0x26, 0x2e, 0x3d, 0x6d, 0xc5, 0xb9,
+0xb3, 0xb2, 0xb4, 0xba, 0xc1, 0xcd, 0xe0, 0xfc, 0xfb, 0xe0,
+0xce, 0xc3, 0xbb, 0xb7, 0xb6, 0xb9, 0xc0, 0xda, 0x4b, 0x36,
+0x2b, 0x25, 0x20, 0x1f, 0x20, 0x26, 0x2e, 0x46, 0xc2, 0xab,
+0x9f, 0x9a, 0x97, 0x96, 0x98, 0x9c, 0xa5, 0xba, 0x41, 0x27,
+0x1b, 0x15, 0x12, 0x11, 0x13, 0x18, 0x1f, 0x32, 0xc8, 0xa6,
+0x9a, 0x94, 0x90, 0x8f, 0x91, 0x97, 0x9e, 0xaf, 0x54, 0x29,
+0x1c, 0x16, 0x12, 0x11, 0x14, 0x18, 0x1f, 0x2e, 0xf2, 0xae,
+0xa0, 0x9b, 0x98, 0x97, 0x99, 0x9d, 0xa5, 0xb3, 0xe4, 0x3a,
+0x2b, 0x25, 0x21, 0x21, 0x24, 0x29, 0x30, 0x3e, 0x62, 0xcd,
+0xbf, 0xbb, 0xbb, 0xbe, 0xc6, 0xd1, 0xe7, 0x76, 0x75, 0xe7,
+0xcf, 0xc1, 0xb9, 0xb2, 0xaf, 0xaf, 0xb2, 0xba, 0xcf, 0x4c,
+0x34, 0x29, 0x22, 0x1e, 0x1d, 0x1e, 0x22, 0x2b, 0x3e, 0xc7,
+0xab, 0x9f, 0x99, 0x96, 0x95, 0x96, 0x9a, 0xa2, 0xb5, 0x4a,
+0x28, 0x1c, 0x15, 0x11, 0x10, 0x12, 0x17, 0x1e, 0x2e, 0xd5,
+0xa9, 0x9b, 0x95, 0x90, 0x8f, 0x91, 0x96, 0x9d, 0xac, 0x78,
+0x2c, 0x1e, 0x17, 0x13, 0x12, 0x14, 0x18, 0x1f, 0x2d, 0x5d,
+0xb3, 0xa4, 0x9d, 0x9a, 0x99, 0x9b, 0x9e, 0xa6, 0xb2, 0xd6,
+0x3f, 0x2f, 0x29, 0x26, 0x26, 0x28, 0x2d, 0x35, 0x42, 0x5e,
+0xd8, 0xca, 0xc6, 0xc9, 0xcf, 0xe4, 0x69, 0x59, 0x58, 0x64,
+0xdf, 0xc7, 0xba, 0xb1, 0xac, 0xaa, 0xaa, 0xad, 0xb4, 0xc7,
+0x4f, 0x33, 0x27, 0x1f, 0x1c, 0x1b, 0x1c, 0x1f, 0x27, 0x39,
+0xce, 0xac, 0x9f, 0x99, 0x95, 0x94, 0x95, 0x99, 0x9f, 0xaf,
0x59, 0x2a, 0x1c, 0x16, 0x11, 0x10, 0x11, 0x16, 0x1d, 0x2b };
}
/*!
- * \brief Function called by core to read any waiting frames
+ * \brief Function called by core to read any waiting frames
*
* \note The channel is already locked.
*/
}
if (!memcmp(buf + SIZE_HEADER, packet_recv_expansion_pressed_key, sizeof(packet_recv_expansion_pressed_key))) {
char keycode = buf[13];
-
+
if (unistimdebug) {
ast_verb(0, "Expansion key pressed: keycode = 0x%02hhx - current state: %s\n", (unsigned char)keycode,
ptestate_tostr(pte->state));
}
ast_mutex_init(&d->lock);
ast_copy_string(d->name, cat, sizeof(d->name));
-
+
ast_copy_string(d->context, DEFAULTCONTEXT, sizeof(d->context));
d->contrast = -1;
d->output = OUTPUT_HANDSET;
if (!rtp) {
return 0;
}
-
+
sub = (struct unistim_subchannel *) ast_channel_tech_pvt(chan);
if (!sub) {
ast_log(LOG_ERROR, "No Private Structure, this is bad\n");
ast_rtp_instance_get_local_address(rtp, &tmp);
ast_sockaddr_to_sin(&tmp, &us);
}
-
+
/* TODO: Set rtp on phone in case of direct rtp (not implemented) */
-
+
return 0;
}
* Copyright (C) 2004 - 2005, Ben Kramer
* Ben Kramer <ben@voicetronix.com.au>
*
- * Daniel Bichara <daniel@bichara.com.br> - Brazilian CallerID detection (c)2004
+ * Daniel Bichara <daniel@bichara.com.br> - Brazilian CallerID detection (c)2004
*
* Welber Silveira - welberms@magiclink.com.br - (c)2004
* Copying CLID string to propper structure after detection
/*! \file
*
* \brief VoiceTronix Interface driver
- *
+ *
* \ingroup channel_drivers
*/
#define DEFAULT_GAIN 0
#define DEFAULT_ECHO_CANCEL 1
-
-#define VPB_SAMPLES 160
+
+#define VPB_SAMPLES 160
#define VPB_MAX_BUF VPB_SAMPLES*4 + AST_FRIENDLY_OFFSET
#define VPB_NULL_EVENT 200
#define MAX_VPB_GAIN 12.0
#define MIN_VPB_GAIN -12.0
-#define DTMF_CALLERID
+#define DTMF_CALLERID
#define DTMF_CID_START 'D'
#define DTMF_CID_STOP 'C'
static int restart_monitor(void);
-/* The private structures of the VPB channels are
+/* The private structures of the VPB channels are
linked for selecting outgoing channels */
-
+
#define MODE_DIALTONE 1
#define MODE_IMMEDIATE 2
#define MODE_FXO 3
#define TIMER_PERIOD_BUSY 700
#define TIMER_PERIOD_RING 4000
static int timer_period_ring = TIMER_PERIOD_RING;
-
+
#define VPB_EVENTS_ALL (VPB_MRING|VPB_MDIGIT|VPB_MDTMF|VPB_MTONEDETECT|VPB_MTIMEREXP \
|VPB_MSTATION_OFFHOOK|VPB_MSTATION_ONHOOK \
|VPB_MRING_OFF|VPB_MDROP|VPB_MSTATION_FLASH)
AST_MUTEX_DEFINE_STATIC(bridge_lock);
typedef enum {
- vpb_model_unknown = 0,
+ vpb_model_unknown = 0,
vpb_model_v4pci,
vpb_model_v12pci
} vpb_model_t;
};
#if defined(VPB_NATIVE_BRIDGING)
-/* Can't get ast_vpb_bridge() working on v4pci without either a horrible
+/* Can't get ast_vpb_bridge() working on v4pci without either a horrible
* high pitched feedback noise or bad hiss noise depending on gain settings
* Get asterisk to do the bridging
*/
/* Bridge channels, check if we can. I believe we always can, so find a slot.*/
ast_mutex_lock(&bridge_lock);
- for (i = 0; i < max_bridges; i++)
+ for (i = 0; i < max_bridges; i++)
if (!bridges[i].inuse)
break;
if (i < max_bridges) {
bridges[i].fo = fo;
bridges[i].c0 = c0;
bridges[i].c1 = c1;
- }
- ast_mutex_unlock(&bridge_lock);
+ }
+ ast_mutex_unlock(&bridge_lock);
if (i == max_bridges) {
ast_log(LOG_WARNING, "%s: vpb_bridge: Failed to bridge %s and %s!\n", p0->dev, ast_channel_name(c0), ast_channel_name(c1));
}
f = ast_read(who);
if (!f || ((f->frametype == AST_FRAME_DTMF) &&
- (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) ||
+ (((who == c0) && (flags & AST_BRIDGE_DTMF_CHANNEL_0)) ||
((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))))) {
*fo = f;
*rc = who;
ast_debug(1, "%s: vpb_bridge: Got a [%s]\n", p0->dev, f ? "digit" : "hangup");
#if 0
if ((c0->tech_pvt == pvt0) && (!ast_check_hangup(c0))) {
- if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
+ if (pr0->set_rtp_peer(c0, NULL, NULL, 0))
ast_log(LOG_WARNING, "Channel '%s' failed to revert\n", c0->name);
}
if ((c1->tech_pvt == pvt1) && (!ast_check_hangup(c1))) {
- if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
+ if (pr1->set_rtp_peer(c1, NULL, NULL, 0))
ast_log(LOG_WARNING, "Channel '%s' failed to revert back\n", c1->name);
}
/* That's all we needed */
break;
}
} else {
- if ((f->frametype == AST_FRAME_DTMF) ||
- (f->frametype == AST_FRAME_VOICE) ||
- (f->frametype == AST_FRAME_VIDEO))
+ if ((f->frametype == AST_FRAME_DTMF) ||
+ (f->frametype == AST_FRAME_VOICE) ||
+ (f->frametype == AST_FRAME_VIDEO))
{
/* Forward voice or DTMF frames if they happen upon us */
/* Actually I dont think we want to forward on any frames!
cs[0] = cs[1];
cs[1] = cs[2];
};
- vpb_bridge(p0->handle, p1->handle, VPB_BRIDGE_OFF);
+ vpb_bridge(p0->handle, p1->handle, VPB_BRIDGE_OFF);
}
#endif
ast_mutex_lock(&bridge_lock);
bridges[i].inuse = 0;
- ast_mutex_unlock(&bridge_lock);
+ ast_mutex_unlock(&bridge_lock);
p0->bridge = NULL;
p1->bridge = NULL;
int rc;
struct ast_channel *owner = p->owner;
/*
- char callerid[AST_MAX_EXTENSION] = "";
+ char callerid[AST_MAX_EXTENSION] = "";
*/
#ifdef ANALYSE_CID
void * ws;
ast_free(owner->cid.cid_name);
owner->cid.cid_name=NULL;
*/
-
+
if (cli_struct->ra_cldn[0] == '\0') {
/*
owner->cid.cid_num = ast_strdup(cli_struct->cldn);
}
delete cli_struct;
- } else
+ } else
ast_log(LOG_ERROR, "CID record - Failed to set record mode for caller id on %s\n", p->dev);
}
cs = callerid_new(which_cid);
if (cs) {
#ifdef ANALYSE_CID
- vpb_wave_open_write(&ws, file, VPB_MULAW);
- vpb_record_set_gain(p->handle, 3.0);
- vpb_record_set_hw_gain(p->handle, 12.0);
+ vpb_wave_open_write(&ws, file, VPB_MULAW);
+ vpb_record_set_gain(p->handle, 3.0);
+ vpb_record_set_hw_gain(p->handle, 12.0);
#endif
vpb_record_buf_start(p->handle, VPB_MULAW);
while ((rc == 0) && (sam_count < 8000 * 3)) {
ast_log(LOG_ERROR, "%s: Caller ID couldn't read audio buffer!\n", p->dev);
rc = callerid_feed(cs, (unsigned char *)buf, sizeof(buf), ast_format_ulaw);
#ifdef ANALYSE_CID
- vpb_wave_write(ws, (char *)buf, sizeof(buf));
+ vpb_wave_write(ws, (char *)buf, sizeof(buf));
#endif
sam_count += sizeof(buf);
ast_verb(4, "Collecting Caller ID samples [%d][%d]...\n", sam_count, rc);
vpb_timer_stop(p->ring_timer);
f.frametype = AST_FRAME_NULL;
}
-
+
} else {
f.frametype = AST_FRAME_NULL; /* Ignore. */
}
/* Nothing heard on line for a very long time
* Timeout connection */
ast_verb(3, "grunt timeout\n");
- ast_log(LOG_NOTICE, "%s: Line hangup due of lack of conversation\n", p->dev);
+ ast_log(LOG_NOTICE, "%s: Line hangup due of lack of conversation\n", p->dev);
f.subclass.integer = AST_CONTROL_HANGUP;
} else {
p->lastgrunt = ast_tvnow();
f.subclass.integer = AST_CONTROL_HANGUP;
}
#else
- ast_log(LOG_NOTICE, "%s: Got call progress callback but blind dialing \n", p->dev);
+ ast_log(LOG_NOTICE, "%s: Got call progress callback but blind dialing \n", p->dev);
f.frametype = AST_FRAME_NULL;
#endif
break;
/*
ast_verb(4, "%s: LOCKING in handle_owned [%d]\n", p->dev,res);
- res = ast_mutex_lock(&p->lock);
+ res = ast_mutex_lock(&p->lock);
ast_verb(4, "%s: LOCKING count[%d] owner[%d] \n", p->dev, p->lock.__m_count,p->lock.__m_owner);
*/
if (p->bridge) { /* Check what happened, see if we need to report it. */
switch (f.frametype) {
case AST_FRAME_DTMF:
- if ( !(p->bridge->c0 == p->owner &&
+ if ( !(p->bridge->c0 == p->owner &&
(p->bridge->flags & AST_BRIDGE_DTMF_CHANNEL_0) ) &&
- !(p->bridge->c1 == p->owner &&
+ !(p->bridge->c1 == p->owner &&
(p->bridge->flags & AST_BRIDGE_DTMF_CHANNEL_1) )) {
/* Kill bridge, this is interesting. */
endbridge = 1;
ast_mutex_lock(&p->bridge->lock);
p->bridge->endbridge = 1;
ast_cond_signal(&p->bridge->cond);
- ast_mutex_unlock(&p->bridge->lock);
- }
+ ast_mutex_unlock(&p->bridge->lock);
+ }
}
if (endbridge) {
else if (p->state == VPB_STATE_PLAYBUSY) {
playtone(p->handle, &Busytone);
p->wantdtmf = 1;
- p->ext[0] = 0;
+ p->ext[0] = 0;
} else if (p->state == VPB_STATE_PLAYRING) {
playtone(p->handle, &Ringbacktone);
p->wantdtmf = 1;
/* No owner any more, Assume caller has hung up */
vpb_timer_stop(p->ring_timer);
}
- }
+ }
break;
case VPB_DTMF:
if (ast_pickup_call(c)) {
/* Call pickup wasnt possible */
}
- } else
+ } else
#endif
if (ast_exists_extension(NULL, p->context, p->ext, 1, p->callerid)) {
if (ast_canmatch_extension(NULL, p->context, p->ext, 1, p->callerid)) {
}
}
- ast_mutex_unlock(&monlock);
+ ast_mutex_unlock(&monlock);
if (!p) {
if (e.type != VPB_NULL_EVENT) {
- ast_log(LOG_WARNING, "Got event [%s][%d], no matching iface!\n", str, e.type);
+ ast_log(LOG_WARNING, "Got event [%s][%d], no matching iface!\n", str, e.type);
ast_verb(4, "vpb/ERR: No interface for Event [%d=>%s] \n", e.type, str);
}
continue;
- }
+ }
/* flush the event from the channel event Q */
vpb_get_event_ch_async(e.handle, &je);
vpb_put_event(&e);
} else {
/* Start a new monitor */
- int pid = ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL);
+ int pid = ast_pthread_create(&monitor_thread, NULL, do_monitor, NULL);
ast_verb(4, "Created new monitor thread %d\n", pid);
if (pid < 0) {
ast_log(LOG_ERROR, "Unable to start monitor thread.\n");
tmp->handle = vpb_open(board, channel);
- if (tmp->handle < 0) {
- ast_log(LOG_WARNING, "Unable to create channel vpb/%d-%d: %s\n",
+ if (tmp->handle < 0) {
+ ast_log(LOG_WARNING, "Unable to create channel vpb/%d-%d: %s\n",
board, channel, strerror(errno));
ast_free(tmp);
return NULL;
}
-
+
snprintf(tmp->dev, sizeof(tmp->dev), "vpb/%d-%d", board, channel);
tmp->mode = mode;
ast_copy_string(tmp->context, context, sizeof(tmp->context));
tmp->callerid_type = 0;
- if (callerid) {
+ if (callerid) {
if (strcasecmp(callerid, "on") == 0) {
tmp->callerid_type = 1;
ast_copy_string(tmp->callerid, "unknown", sizeof(tmp->callerid));
} else {
tmp->txgain = txgain;
}
-
+
ast_log(LOG_NOTICE, "VPB setting Tx Hw gain to [%f]\n", tmp->txgain);
vpb_play_set_hw_gain(tmp->handle, tmp->txgain);
}
/* set default read state */
tmp->read_state = 0;
-
+
tmp->golock = 0;
tmp->busy_timer_id = vpb_timer_get_unique_timer_id();
tmp->ring_timer_id = vpb_timer_get_unique_timer_id();
vpb_timer_open(&tmp->ring_timer, tmp->handle, tmp->ring_timer_id, timer_period_ring);
-
+
tmp->dtmfidd_timer_id = vpb_timer_get_unique_timer_id();
vpb_timer_open(&tmp->dtmfidd_timer, tmp->handle, tmp->dtmfidd_timer_id, dtmf_idd);
-
+
if (mode == MODE_FXO){
if (use_ast_dtmfdet)
vpb_set_event_mask(tmp->handle, VPB_EVENTS_NODTMF);
if (ast_channel_state(ast) == AST_STATE_UP) {
playtone(p->handle, &Busytone);
p->state = VPB_STATE_PLAYBUSY;
- vpb_timer_stop(p->busy_timer);
- vpb_timer_start(p->busy_timer);
+ vpb_timer_stop(p->busy_timer);
+ vpb_timer_start(p->busy_timer);
}
break;
case AST_CONTROL_RINGING:
vpb_timer_stop(p->ringback_timer);
vpb_timer_start(p->ringback_timer);
}
- break;
+ break;
case AST_CONTROL_ANSWER:
case -1: /* -1 means stop playing? */
vpb_timer_stop(p->ringback_timer);
call.answer_timeout);
for (j = 0; !call.tone_map[j].terminate; j++) {
ast_verb(2, "%s: Dial parms for %s tone %d->%d\n", p->dev,
- ast_channel_name(ast), call.tone_map[j].tone_id, call.tone_map[j].call_id);
+ ast_channel_name(ast), call.tone_map[j].tone_id, call.tone_map[j].call_id);
}
ast_verb(4, "%s: Disabling Loop Drop detection\n", p->dev);
/* Stop record */
p->stopreads = 1;
if (p->readthread) {
- pthread_join(p->readthread, NULL);
+ pthread_join(p->readthread, NULL);
ast_verb(4, "%s: stopped record thread \n", ast_channel_name(ast));
}
vpb_ring_station_async(p->handle, 0);
if (p->state != VPB_STATE_ONHOOK) {
/* This is causing a "dial end" "play tone" loop
- playtone(p->handle, &Busytone);
+ playtone(p->handle, &Busytone);
p->state = VPB_STATE_PLAYBUSY;
ast_verb(5, "%s: Station offhook[%d], playing busy tone\n",
ast->name,p->state);
static struct ast_frame *vpb_read(struct ast_channel *ast)
{
- struct vpb_pvt *p = (struct vpb_pvt *)ast_channel_tech_pvt(ast);
- static struct ast_frame f = { AST_FRAME_NULL };
+ struct vpb_pvt *p = (struct vpb_pvt *)ast_channel_tech_pvt(ast);
+ static struct ast_frame f = { AST_FRAME_NULL };
f.src = "vpb";
ast_log(LOG_NOTICE, "%s: vpb_read: should never be called!\n", p->dev);
}
}
-int a_gain_vector(float g, short *v, int n)
+int a_gain_vector(float g, short *v, int n)
{
int i;
float tmp;
tmp = 32767.0;
if (tmp < -32768.0)
tmp = -32768.0;
- v[i] = (short)tmp;
- }
+ v[i] = (short)tmp;
+ }
return i;
}
/* Writes a frame of voice data to a VPB channel */
static int vpb_write(struct ast_channel *ast, struct ast_frame *frame)
{
- struct vpb_pvt *p = (struct vpb_pvt *)ast_channel_tech_pvt(ast);
+ struct vpb_pvt *p = (struct vpb_pvt *)ast_channel_tech_pvt(ast);
int res = 0;
AudioCompress fmt = VPB_RAW;
struct timeval play_buf_time_start;
}
tdiff = ast_tvdiff_ms(ast_tvnow(), p->lastplay);
- ast_debug(1, "%s: vpb_write: time since last play(%d) \n", p->dev, tdiff);
+ ast_debug(1, "%s: vpb_write: time since last play(%d) \n", p->dev, tdiff);
if (tdiff < (VPB_SAMPLES / 8 - 1)) {
- ast_debug(1, "%s: vpb_write: Asked to play too often (%d) (%d)\n", p->dev, tdiff, frame->datalen);
+ ast_debug(1, "%s: vpb_write: Asked to play too often (%d) (%d)\n", p->dev, tdiff, frame->datalen);
/* return 0; */
}
p->lastplay = ast_tvnow();
/*
- ast_debug(1, "%s: vpb_write: Checked frame format..\n", p->dev);
+ ast_debug(1, "%s: vpb_write: Checked frame format..\n", p->dev);
*/
ast_mutex_lock(&p->play_lock);
/*
- ast_debug(1, "%s: vpb_write: Got play lock..\n", p->dev);
+ ast_debug(1, "%s: vpb_write: Got play lock..\n", p->dev);
*/
/* Check if we have set up the play_buf */
ast_verb(3, "%s: chanreads: starting thread\n", p->dev);
ast_mutex_lock(&p->record_lock);
- p->stopreads = 0;
+ p->stopreads = 0;
p->read_state = 1;
while (!p->stopreads && p->owner) {
}
p->last_ignore_dtmf = ignore_dtmf;
- /* Play DTMF digits here to avoid problem you get if playing a digit during
+ /* Play DTMF digits here to avoid problem you get if playing a digit during
* a record operation
*/
ast_verb(6, "%s: chanreads: Checking dtmf's \n", p->dev);
p->play_dtmf[0] = '\0';
ast_mutex_unlock(&p->play_dtmf_lock);
vpb_sleep(700); /* Long enough to miss echo and DTMF event */
- if( !ignore_dtmf)
+ if( !ignore_dtmf)
vpb_set_event_mask(p->handle, VPB_EVENTS_ALL);
continue;
}
ast_mutex_unlock(&p->record_lock);
ast_verb(2, "%s: Ending record mode (%d/%s)\n",
- p->dev, p->stopreads, p->owner ? "yes" : "no");
+ p->dev, p->stopreads, p->owner ? "yes" : "no");
return NULL;
}
static struct ast_channel *vpb_new(struct vpb_pvt *me, enum ast_channel_state state, const char *context, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor)
{
- struct ast_channel *tmp;
+ struct ast_channel *tmp;
char cid_num[256];
char cid_name[256];
ast_channel_callgroup_set(tmp, me->callgroup);
ast_channel_pickupgroup_set(tmp, me->pickupgroup);
-
+
/* Linear is the preferred format. Although Voicetronix supports other formats
* they are all converted to/from linear in the vpb code. Best for us to use
* linear since we can then adjust volume in this modules.
ast_set_callerid(tmp, cid_num, cid_name, cid_num);
}
ast_channel_tech_pvt_set(tmp, me);
-
+
ast_channel_context_set(tmp, context);
if (!ast_strlen_zero(me->ext))
ast_channel_exten_set(tmp, me->ext);
me->readthread = 0;
me->play_dtmf[0] = '\0';
me->faxhandled = 0;
-
+
me->lastgrunt = ast_tvnow(); /* Assume at least one grunt tone seen now. */
me->lastplay = ast_tvnow(); /* Assume at least one grunt tone seen now. */
return tmp;
}
-static struct ast_channel *vpb_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
+static struct ast_channel *vpb_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
{
struct vpb_pvt *p;
struct ast_channel *tmp = NULL;
/* Destroy all the interfaces and free their memory */
while (iflist) {
- p = iflist;
+ p = iflist;
ast_mutex_destroy(&p->lock);
pthread_cancel(p->readthread);
ast_mutex_destroy(&p->owner_lock);
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static enum ast_module_load_result load_module()
ast_group_t callgroup = 0;
ast_group_t pickupgroup = 0;
int mode = MODE_IMMEDIATE;
- float txgain = DEFAULT_GAIN, rxgain = DEFAULT_GAIN;
- float txswgain = 0, rxswgain = 0;
+ float txgain = DEFAULT_GAIN, rxgain = DEFAULT_GAIN;
+ float txswgain = 0, rxswgain = 0;
int got_gain=0;
int first_channel = 1;
int echo_cancel = DEFAULT_ECHO_CANCEL;
enum ast_module_load_result error = AST_MODULE_LOAD_SUCCESS; /* Error flag */
int bal1 = -1; /* Special value - means do not set */
- int bal2 = -1;
+ int bal2 = -1;
int bal3 = -1;
char * callerid = NULL;
int num_cards = 0;
if (!cfg || cfg == CONFIG_STATUS_FILEINVALID) {
ast_log(LOG_ERROR, "Unable to load config %s\n", config);
return AST_MODULE_LOAD_DECLINE;
- }
+ }
ast_mutex_lock(&iflock);
v = ast_variable_browse(cfg, "general");
}
v = v->next;
}
-
+
v = ast_variable_browse(cfg, "interfaces");
while (v) {
/* Create the interface list */
if (error != AST_MODULE_LOAD_SUCCESS)
unload_module();
- else
+ else
restart_monitor(); /* And start the monitor for the first time */
return error;
* $Revision$
*/
-/*
+/*
* Message board implementation.
*
* A message board is a region of the SDL screen where
* of fixed size (rows and cols). A portion of the buffer is
* visible on the screen, and the visible window can be moved up and
* down by dragging (not yet!)
- *
+ *
* TODO: font dynamic allocation
*
* The region where the text is displayed on the screen is defined
screen->format->Rmask, screen->format->Gmask,
screen->format->Bmask, screen->format->Amask);
- if (b->blank == NULL) {
+ if (b->blank == NULL) {
ast_log(LOG_WARNING, "Unable to allocate board virtual screen: %s\n",
SDL_GetError());
ast_free(b->text);
/*
* GUI layout, structure and management
-
+
For the GUI we use SDL to create a large surface (gui->screen) with 4 areas:
remote video on the left, local video on the right, keypad with all controls
and text windows in the center, and source device thumbnails on the top.
int outfd; /* fd for output */
SDL_Surface *keypad; /* the skin for the keypad */
SDL_Rect kp_rect; /* portion of the skin to display - default all */
- SDL_Surface *font; /* font to be used */
+ SDL_Surface *font; /* font to be used */
SDL_Rect font_rects[96]; /* only printable chars */
/* each of the following board has two rectangles,
if (gui == NULL)
return NULL;
- /* unload font file */
+ /* unload font file */
if (gui->font) {
SDL_FreeSurface(gui->font);
- gui->font = NULL;
+ gui->font = NULL;
}
if (gui->outfd > -1)
if (gui->thumb_bd_array[i].board) /* may be useless */
delete_board(gui->thumb_bd_array[i].board);
}
-
+
ast_free(gui);
SDL_Quit();
return NULL;
return;
p_in = NULL;
b_out = &env->src_dpy[i];
- }
+ }
bmp = gui->win[out].bmp;
SDL_LockYUVOverlay(bmp);
/* output picture info - this is sdl, YUV420P */
/* accumulate digits, possibly call dial if in connected mode */
static void keypad_digit(struct video_desc *env, int digit)
-{
+{
if (env->owner) { /* we have a call, send the digit */
struct ast_frame f = { AST_FRAME_DTMF, 0 };
*
* To generate a font we can use the 'fly' command with the
* following script (3 lines with 32 chars each)
-
+
size 320,64
name font.png
transparent 0,0,0
{
return 1; /* error, not supported */
}
-#endif
+#endif
static int video_geom(struct fbuf_t *b, const char *s);
static void sdl_setup(struct video_desc *env);
}
/*! \brief Changes the video output (local video) source, controlling if
- * it is already using that video device,
+ * it is already using that video device,
* and switching the correct fields of env->out.
* grabbers are always open and saved in the device table.
* The secondary or the primary device can be changed,
* according to the "button" parameter:
* the primary device is changed if button = SDL_BUTTON_LEFT;
* the secondary device is changed if button = not SDL_BUTTON_LEFT;
- *
+ *
* the correct message boards of the sources are also updated
* with the new status
- *
+ *
* \param env = pointer to the video environment descriptor
* \param index = index of the device the caller wants to use are primary or secondary device
* \param button = button clicked on the mouse
*
* returns 0 on success,
- * returns 1 on error
+ * returns 1 on error
*/
static int switch_video_out(struct video_desc *env, int index, Uint8 button)
{
ast_log(LOG_WARNING, "switching to %s...\n", env->out.devices[index].name);
/* already open */
if (env->out.devices[index].grabber) {
- /* we also have to update the messages in the source
+ /* we also have to update the messages in the source
message boards below the source windows */
/* first we update the board of the previous source */
if (p == &env->out.device_primary)
/* print the new message in the message board */
update_device_info(env, index);
return 2; /* closed */
- }
+ }
}
/*
{
uint8_t index = KEY_OUT_OF_KEYPAD; /* the key or region of the display we clicked on */
struct gui_info *gui = env->gui;
-
+
int i; /* integer variable used as iterator */
int x; /* integer variable usable as a container */
-
+
/* total width of source device thumbnails */
int src_wins_tot_w = env->out.device_num*(SRC_WIN_W+BORDER)+BORDER;
/* x coordinate of the center of the keypad */
int x0 = MAX(env->rem_dpy.w+gui->keypad->w/2+2*BORDER, src_wins_tot_w/2);
-
+
#if 0
ast_log(LOG_WARNING, "event %d %d have %d/%d regions at %p\n",
button.x, button.y, gui->kp_used, gui->kp_size, gui->kp);
#endif
/* for each mousedown we end previous drag */
gui->drag.drag_window = DRAG_NONE;
-
+
/* define keypad boundary */
/* XXX this should be extended for clicks on different audio device markers */
if (button.y >= (env->out.device_num ? SRC_WIN_H+2*BORDER+SRC_MSG_BD_H : 0)) {
else if (button.x >= x0 + gui->keypad->w/2)
index = KEY_OUT_OF_KEYPAD;
else if (gui->kp) {
- /* we have to calculate the first coordinate
+ /* we have to calculate the first coordinate
inside the keypad before calling the kp_match_area*/
int x_keypad = button.x - (x0 - gui->keypad->w/2);
/* find the key clicked (if one was clicked) */
else if (button.x < x)
index = KEY_OUT_OF_KEYPAD;
else if (button.x < x + src_wins_tot_w - BORDER) {
- /* note that the additional device windows
+ /* note that the additional device windows
are numbered from left to right
starting from 0, with a maximum of 8, the index associated on a click is:
KEY_SRCS_WIN + number_of_the_window */
if (index == KEY_LOC_DPY && env->out.picture_in_picture &&
button.x >= x0+gui->keypad->w/2+BORDER+pip_loc_x &&
button.x < x0+gui->keypad->w/2+BORDER+pip_loc_x+env->loc_dpy.w/3 &&
- button.y >= BORDER+pip_loc_y &&
+ button.y >= BORDER+pip_loc_y &&
button.y < BORDER+pip_loc_y+env->loc_dpy.h/3) {
/* set the y cordinate to his previous value */
button.y += (env->out.device_num ? SRC_WIN_H+2*BORDER+SRC_MSG_BD_H : 0);
fb->w, fb->h);
video_geom(fb, buf);
sdl_setup(env);
- /* writes messages in the source boards, those can be
- modified during the execution, because of the events
+ /* writes messages in the source boards, those can be
+ modified during the execution, because of the events
this must be done here, otherwise the status of sources will not be
shown after sdl_setup */
for (i = 0; i < env->out.device_num; i++) {
update_device_info(env, i);
}
- /* we also have to refresh other boards,
+ /* we also have to refresh other boards,
to avoid messages to disappear after video resize */
print_message(gui->bd_msg, " \b");
print_message(gui->bd_dialed, " \b");
static SDL_Surface *load_image(const char *file)
{
SDL_Surface *temp;
-
+
#ifdef HAVE_SDL_IMAGE
temp = IMG_Load(file);
#else
const SDL_VideoInfo *info;
int kp_w = 0, kp_h = 0; /* keypad width and height */
struct gui_info *gui = env->gui;
-
+
/* Some helper variables used for filling the SDL window */
int x0; /* the x coordinate of the center of the keypad */
int x1; /* userful for calculating of the size of the parent window */
int src_wins_tot_w; /* total width of the source windows */
int i;
int x; /* useful for the creation of the source windows; */
-
+
#ifdef HAVE_X11
const char *e = getenv("SDL_WINDOWID");
ast_log(LOG_WARNING, "%s error in window\n", __FUNCTION__);
return;
}
- }
+ }
#endif
/*
* initialize the SDL environment. We have one large window
kp_h = gui->keypad->h;
}
}
-
+
/* total width of the thumbnails */
src_wins_tot_w = env->out.device_num*(SRC_WIN_W+BORDER)+BORDER;
-
+
/* x coordinate of the center of the keypad */
x0 = MAX(env->rem_dpy.w+kp_w/2+2*BORDER, src_wins_tot_w/2);
-
+
/* from center of the keypad to right border */
x1 = MAX(env->loc_dpy.w+kp_w/2+2*BORDER, src_wins_tot_w/2);
-
+
/* total width of the SDL window to create */
maxw = x0+x1;
-
+
/* total height of the mother window to create */
maxh = MAX( MAX(env->rem_dpy.h, env->loc_dpy.h), kp_h)+2*BORDER;
maxh += env->out.device_num ? (2*BORDER+SRC_WIN_H+SRC_MSG_BD_H) : 0;
-
+
gui->screen = SDL_SetVideoMode(maxw, maxh, depth, 0);
if (!gui->screen) {
ast_log(LOG_ERROR, "SDL: could not set video mode - exiting\n");
#endif /* HAVE_X11 */
y0 = env->out.device_num ? (3*BORDER+SRC_WIN_H+SRC_MSG_BD_H) : BORDER;
-
+
SDL_WM_SetCaption("Asterisk console Video Output", NULL);
-
+
/* intialize the windows for local and remote video */
if (set_win(gui->screen, &gui->win[WIN_REMOTE], dpy_fmt,
env->rem_dpy.w, env->rem_dpy.h, x0-kp_w/2-BORDER-env->rem_dpy.w, y0))
env->loc_dpy.w, env->loc_dpy.h,
x0+kp_w/2+BORDER, y0))
goto no_sdl;
-
+
/* initialize device_num source windows (thumbnails) and boards
(for a maximum of 9 additional windows and boards) */
x = x0 - src_wins_tot_w/2 + BORDER;
#else /* defined(HAVE_FFMPEG) && defined(HAVE_SDL) */
/*! The list of video formats we support. */
-int console_video_formats =
+int console_video_formats =
AST_FORMAT_H263_PLUS | AST_FORMAT_H263 |
AST_FORMAT_MP4_VIDEO | AST_FORMAT_H264 | AST_FORMAT_H261 ;
* + the encoding and RTP info, including timestamps to generate
* frames at the correct rate;
* + source-specific info, i.e. fd for /dev/video, dpy-image for x11, etc,
- * filled in by grabber_open, part of source_specific information are in
+ * filled in by grabber_open, part of source_specific information are in
* the device table (devices member), others are shared;
* NOTE: loc_src.data == NULL means the rest of the struct is invalid, and
* the video source is not available.
AVFrame *enc_in_frame; /* enc_in mapped into avcodec format. */
/* The initial part of AVFrame is an AVPicture */
int mtu;
-
+
/* Table of devices specified with "videodevice=" in oss.conf.
* Static size as we have a limited number of entries.
*/
- struct video_device devices[MAX_VIDEO_SOURCES];
+ struct video_device devices[MAX_VIDEO_SOURCES];
int device_num; /*number of devices in table*/
int device_primary; /*index of the actual primary device in the table*/
int device_secondary; /*index of the actual secondary device in the table*/
int picture_in_picture; /*Is the PiP mode activated? 0 = NO | 1 = YES*/
- /* these are the coordinates of the picture inside the picture (visible if PiP mode is active)
+ /* these are the coordinates of the picture inside the picture (visible if PiP mode is active)
these coordinates are valid considering the containing buffer with cif geometry*/
int pip_x;
int pip_y;
return 0;
}
#endif
-
+
#include "vcodecs.c"
#include "console_gui.c"
*
* \param v = video out environment descriptor
*
- * returns 0 on success, 1 on error
+ * returns 0 on success, 1 on error
*/
static int grabber_open(struct video_out_desc *v)
{
}
/* the first working device is selected as the primary one and the secondary one */
for (i = 0; i < v->device_num; i++) {
- if (!v->devices[i].grabber)
+ if (!v->devices[i].grabber)
continue;
v->device_primary = i;
v->device_secondary = i;
if (dev->grabber == NULL) /* not initialized */
return NULL;
-
+
/* the last_frame field in this row of the device table (dev)
is always initialized, it is set during the parsing of the config
file, and never unset, function fill_device_table(). */
{
struct video_out_desc *v = &env->out;
int i; /* integer variable used as iterator */
-
+
/* XXX this should be a codec callback */
if (v->enc_ctx) {
AVCodecContext *enc_ctx = (AVCodecContext *)v->enc_ctx;
int len = b->w; /* Y linesize, bytes */
int luv = b->w/2; /* U/V linesize, bytes */
int sample_size = 1;
-
+
memset(p, '\0', sizeof(*p));
switch (b->pix_fmt) {
case PIX_FMT_RGB555:
break;
}
len *= sample_size;
-
+
p->data[0] = b->data;
p->linesize[0] = len;
/* these are only valid for component images */
p->data[2] = luv ? b->data + 5*l4 : b->data+len;
p->linesize[1] = luv;
p->linesize[2] = luv;
-
- /* add the offsets to the pointers previously calculated,
+
+ /* add the offsets to the pointers previously calculated,
it is necessary for the picture in picture mode */
p->data[0] += len*b->win_y + b->win_x*sample_size;
- if (luv) {
+ if (luv) {
p->data[1] += luv*(b->win_y/2) + (b->win_x/2) * sample_size;
p->data[2] += luv*(b->win_y/2) + (b->win_x/2) * sample_size;
}
}
}
show_frame(env, WIN_LOCAL); /* local rendering */
- for (i = 0; i < env->out.device_num; i++)
+ for (i = 0; i < env->out.device_num; i++)
show_frame(env, i+WIN_SRC1); /* rendering of every source device in thumbnails */
if (tail == NULL)
tail = &dummy;
/* manage keypad events */
/* XXX here we should always check for events,
- * otherwise the drag will not work */
+ * otherwise the drag will not work */
if (env->gui)
eventhandler(env, caption);
if (env == NULL) {
ast_log(LOG_WARNING, "fail to allocate video_desc\n");
return 1; /* error */
-
+
}
/* set default values - 0's are already there */
env->out.device_primary = 0;
int ebit; /* bits to ignore at the end */
int x; /* origin, if necessary */
int y;
- int w; /* size */
+ int w; /* size */
int h;
int pix_fmt;
/* offsets and size of the copy in Picture-in-Picture mode */
* Asterisk -- An open source telephony toolkit.
*
* Implementation of Inter-Asterisk eXchange
- *
+ *
* Copyright (C) 2003, Digium
*
* Mark Spencer <markster@linux-support.net>
* \ref iax2-parser.h
* \ref chan_iax2.c
*/
-
+
#ifndef _IAX2_H
#define _IAX2_H
* Asterisk -- An open source telephony toolkit.
*
* Implementation of Inter-Asterisk eXchange
- *
+ *
* Copyright (C) 2003, Digium
*
* Mark Spencer <markster@digium.com>
/*!\file
* \brief Implementation of the IAX2 protocol
*/
-
+
#ifndef _IAX2_PARSER_H
#define _IAX2_PARSER_H
*
* \brief Implementation of Inter-Asterisk eXchange Protocol, v 2
*
- * \author Mark Spencer <markster@digium.com>
+ * \author Mark Spencer <markster@digium.com>
*/
/*** MODULEINFO
strncpy(output, value, maxlen);
output[maxlen] = '\0';
-
+
iax2_codec_pref_convert(&pref, output, total_len, 0);
memset(output,0,total_len);
iax2_codec_pref_string(&pref, output, total_len);
if (len == (int)sizeof(unsigned int))
snprintf(output, maxlen, "%lu", (unsigned long)ntohl(get_unaligned_uint32(value)));
else
- ast_copy_string(output, "Invalid INT", maxlen);
+ ast_copy_string(output, "Invalid INT", maxlen);
}
static void dump_short(char *output, int maxlen, void *value, int len)
tm.tm_mday = (val >> 16) & 0x1f;
tm.tm_mon = ((val >> 21) & 0x0f) - 1;
tm.tm_year = ((val >> 25) & 0x7f) + 100;
- ast_strftime(output, maxlen, "%Y-%m-%d %T", &tm);
+ ast_strftime(output, maxlen, "%Y-%m-%d %T", &tm);
} else
ast_copy_string(output, "Invalid DATETIME format!", maxlen);
}
char tmp[256];
if (len < 2)
return;
- strcpy(output, "\n");
+ strcpy(output, "\n");
maxlen -= strlen(output); output += strlen(output);
while(len > 2) {
ie = iedata[0];
return iax_ie_append_raw(ied, ie, &newval, (int) sizeof(newval));
}
-int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value)
+int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value)
{
unsigned int newval;
newval = htonl(value);
return iax_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
}
-int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value)
+int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value)
{
unsigned short newval;
newval = htons(value);
return iax_ie_append_raw(ied, ie, &dat, 1);
}
-int iax_ie_append(struct iax_ie_data *ied, unsigned char ie)
+int iax_ie_append(struct iax_ie_data *ied, unsigned char ie)
{
return iax_ie_append_raw(ied, ie, NULL, 0);
}
snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->msgcount = ntohs(get_unaligned_uint16(data + 2));
+ ies->msgcount = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_AUTOANSWER:
ies->autoanswer = 1;
snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));
+ ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_DEVICETYPE:
ies->devicetype = (char *)data + 2;
snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
errorf(tmp);
} else
- ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));
+ ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));
break;
case IAX_IE_RR_JITTER:
if (len != (int)sizeof(unsigned int)) {
fr->direction = direction;
fr->retrans = -1;
-
+
if (fr->direction == DIRECTION_INGRESS)
ast_atomic_fetchadd_int(&iframes, 1);
else
ast_atomic_fetchadd_int(&oframes, 1);
-
+
ast_atomic_fetchadd_int(&frames, 1);
return fr;
*/
/*! \file
- *
- * \brief IAX Provisioning Protocol
+ *
+ * \brief IAX Provisioning Protocol
*
* \author Mark Spencer <markster@digium.com>
*/
if (!buf || buflen < 1)
return NULL;
-
+
buf[0] = '\0';
for (x = 0; x < ARRAY_LEN(iax_flags); x++) {
}
}
- if (!ast_strlen_zero(buf))
+ if (!ast_strlen_zero(buf))
buf[strlen(buf) - 1] = '\0';
else
strncpy(buf, "none", buflen - 1);
iax_ie_append_int(provdata, PROV_IE_FORMAT, cur->format);
if (force || cur->tos)
iax_ie_append_byte(provdata, PROV_IE_TOS, cur->tos);
-
+
/* Calculate checksum of message so far */
sig = prov_ver_calc(provdata);
if (signature)
ast_log(LOG_WARNING, "Unable to find base template '%s' for creating '%s'. Trying '%s'\n", t, s, def);
else
def = t;
- }
+ }
if (!src) {
src = iax_template_find(def, 0);
if (!src)
cur->server = ntohl(ia.s_addr);
else
cur->altserver = ntohl(ia.s_addr);
- } else
+ } else
ast_log(LOG_WARNING, "Ignoring invalid %s '%s' for '%s' at line %d\n", v->name, v->value, s, v->lineno);
} else if (!strcasecmp(v->name, "codec")) {
struct ast_format *tmpfmt;
static const char *iax_server(unsigned int addr)
{
struct in_addr ia;
-
+
if (!addr)
return "<unspecified>";
-
+
ia.s_addr = htonl(addr);
return ast_inet_ntoa(ia);
ast_mutex_lock(&provlock);
AST_LIST_TRAVERSE(&templates, cur, list) {
if ((a->argc == 3) || (!strcasecmp(a->argv[3], cur->name))) {
- if (found)
+ if (found)
ast_cli(a->fd, "\n");
ast_copy_string(server, iax_server(cur->server), sizeof(server));
ast_copy_string(alternate, iax_server(cur->altserver), sizeof(alternate));
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
if (!provinit)
iax_provision_init();
-
+
cfg = ast_config_load2("iaxprov.conf", "chan_iax2", config_flags);
if (cfg != NULL && cfg != CONFIG_STATUS_FILEUNCHANGED && cfg != CONFIG_STATUS_FILEINVALID) {
/* Mark all as dead. No need for locking */
misdn_lib_get_l1_up(stack);
}
}
-
-
ANALOG_EVENT_EC_NLP_ENABLED,
ANALOG_EVENT_ERROR, /* not a DAHDI event */
ANALOG_EVENT_DTMFCID, /* not a DAHDI event */
- ANALOG_EVENT_PULSEDIGIT = (1 << 16),
+ ANALOG_EVENT_PULSEDIGIT = (1 << 16),
ANALOG_EVENT_DTMFDOWN = (1 << 17),
ANALOG_EVENT_DTMFUP = (1 << 18),
};
int (* const check_confirmanswer)(void *pvt);
void (* const set_callwaiting)(void *pvt, int callwaiting_enable);
void (* const cancel_cidspill)(void *pvt);
- int (* const confmute)(void *pvt, int mute);
+ int (* const confmute)(void *pvt, int mute);
void (* const set_pulsedial)(void *pvt, int flag);
void (* const set_new_owner)(void *pvt, struct ast_channel *new_owner);
AST_TEST_UNREGISTER(sip_parse_host_line_test);
AST_TEST_UNREGISTER(sip_parse_nat_test);
}
-
AST_APP_ARG(type);
AST_APP_ARG(field);
);
-
+
/* Check for zero arguments */
if (ast_strlen_zero(parse)) {
ast_log(LOG_ERROR, "Cannot call %s without arguments\n", funcname);
{
AST_TEST_UNREGISTER(test_sip_rtpqos_1);
}
-
/*!
* \brief parses a config line for a host with a transport
*
- * An example input would be:
+ * An example input would be:
* <code>tls://www.google.com:8056</code>
*
* \retval 0 on success
extern struct ast_channel_tech sip_tech_info;
#endif /* !defined(SIP_GLOBALS_H) */
-
* parts, user:secret.
* - If the URI contains a port number, hostport will return with both
* parts, host:port.
- * - This function overwrites the the URI string.
- *
+ * - This function overwrites the URI string.
+ *
* \retval 0 on success
* \retval -1 on error.
*
{
struct bitbuf a = bitbuf_init(b->data, b->used * 8, 0);
uint32_t x, y;
-
+
x = getbits(&a, 20); /* PSC, 0000 0000 0000 0001 0000 */
if (x != 0x10) {
ast_log(LOG_WARNING, "bad PSC 0x%x\n", x);
ast_log(LOG_WARNING, "--- frame error l %d\n", l);
break;
}
-
+
if (d[0] == 0 && d[1] == 0) { /* we start with a psc */
h = 0;
} else { /* no psc, create a header */
* TR:8 .... .... temporal reference
* PTYPE:13 or more ptype...
* If we don't fragment a GOB SBIT and EBIT = 0.
- * reference, 8 bit)
- *
+ * reference, 8 bit)
+ *
* The assumption below is that we start with a PSC.
*/
static struct ast_frame *h263_encap(struct fbuf_t *b, int mtu,
.dec_init = NULL,
.dec_decap = h263_decap,
.dec_run = ffmpeg_decode
-
+
};
/*---- h261 support -----*/
* - 0..n 0-byte(s), unused, optional. one zero-byte is always present
* in the first NAL before the start code prefix.
* - start code prefix (3 bytes): 0x000001
- * (the first bytestream has a
+ * (the first bytestream has a
* like these 0x00000001!)
* - NAL header byte ( F[1] | NRI[2] | Type[5] ) where type != 0
* - byte-stream
{ AST_FORMAT_MP4_VIDEO, CODEC_ID_MPEG4, CM_RDWR },
{ 0, 0, 0 },
};
-
+
/*! \brief map an asterisk format into an ffmpeg one */
static enum CodecID map_video_format(uint32_t ast_format, int rw)
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright 2007, Luigi Rizzo
+ * Copyright 2007, Luigi Rizzo
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
struct fbuf_t *b;
/* name should be something under /dev/ */
- if (strncmp(dev, "/dev/", 5))
+ if (strncmp(dev, "/dev/", 5))
return NULL;
fd = open(dev, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for codec modules
#
# Copyright (C) 1999-2006, Digium, Inc.
/*! \file
*
* \brief codec_adpcm.c - translate between signed linear and Dialogic ADPCM
- *
+ *
* \ingroup codecs
*/
#include "ex_adpcm.h"
/*
- * Step size index shift table
+ * Step size index shift table
*/
static int indsft[8] = { -1, -1, -1, -1, 2, 4, 6, 8 };
int step;
int encoded;
- /*
+ /*
* Clip csig if too large or too small
*/
csig >>= 4;
/* feedback to state */
decode(encoded, state);
-
+
return encoded;
}
struct ast_frame *f;
int i;
int samples = pvt->samples; /* save original number */
-
+
if (samples < 2)
return NULL;
/*! \file
*
* \brief codec_alaw.c - translate between signed linear and alaw
- *
+ *
* \ingroup codecs
*/
pvt->samples += i;
pvt->datalen += i * 2; /* 2 bytes/sample */
-
+
while (i--)
*dst++ = AST_ALAW(*src++);
pvt->samples += i;
pvt->datalen += i; /* 1 byte/sample */
- while (i--)
+ while (i--)
*dst++ = AST_LIN2A(*src++);
return 0;
/* g722_decode expects the samples to be in the invalid samples / 2 format */
in_samples = f->samples / 2;
- out_samples = g722_decode(&tmp->g722, &pvt->outbuf.i16[pvt->samples * sizeof(int16_t)],
+ out_samples = g722_decode(&tmp->g722, &pvt->outbuf.i16[pvt->samples * sizeof(int16_t)],
(uint8_t *) f->data.ptr, in_samples);
pvt->samples += out_samples;
struct g722_encoder_pvt *tmp = pvt->pvt;
int outlen;
- outlen = g722_encode(&tmp->g722, (&pvt->outbuf.ui8[pvt->datalen]),
+ outlen = g722_encode(&tmp->g722, (&pvt->outbuf.ui8[pvt->datalen]),
(int16_t *) f->data.ptr, f->samples);
pvt->samples += outlen * 2;
if (res) {
unload_module();
return AST_MODULE_LOAD_DECLINE;
- }
+ }
return AST_MODULE_LOAD_SUCCESS;
}
if (res) {
unload_module();
return AST_MODULE_LOAD_DECLINE;
- }
+ }
return AST_MODULE_LOAD_SUCCESS;
}
static int gsm_new(struct ast_trans_pvt *pvt)
{
struct gsm_translator_pvt *tmp = pvt->pvt;
-
+
return (tmp->gsm = gsm_create()) ? 0 : -1;
}
src = f->data.ptr + x;
}
/* XXX maybe we don't need to check */
- if (pvt->samples + len > BUFFER_SAMPLES) {
+ if (pvt->samples + len > BUFFER_SAMPLES) {
ast_log(LOG_WARNING, "Out of buffer space\n");
return -1;
}
*
* The lpc10 code is from a library used by nautilus, modified to be a bit
* nicer to the compiler.
- * See http://www.arl.wustl.edu/~jaf/
+ * See http://www.arl.wustl.edu/~jaf/
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
pvt->datalen += 2*LPC10_SAMPLES_PER_FRAME;
len += LPC10_BYTES_IN_COMPRESSED_FRAME;
}
- if (len != f->datalen)
+ if (len != f->datalen)
printf("Decoded %d, expected %d\n", len, f->datalen);
return 0;
}
* at the top of the source tree.
*/
-/*!
+/*!
* \file
*
* \brief Resample slinear audio
- *
+ *
* \ingroup codecs
*/
*
* \brief Translate between signed linear and Speex (Open Codec)
*
- * \note This work was motivated by Jeremy McNamara
+ * \note This work was motivated by Jeremy McNamara
* hacked to be configurable by anthm and bkw 9/28/2004
*
* \ingroup codecs
/* We require a post 1.1.8 version of Speex to enable preprocessing
* and better type handling
- */
+ */
#ifdef _SPEEX_TYPES_H
#include <speex/speex_preprocess.h>
#endif
if (abr)
speex_encoder_ctl(tmp->speex, SPEEX_SET_ABR, &abr);
if (dtx)
- speex_encoder_ctl(tmp->speex, SPEEX_SET_DTX, &dtx);
+ speex_encoder_ctl(tmp->speex, SPEEX_SET_DTX, &dtx);
tmp->silent_state = 0;
return 0;
static int speex_decoder_construct(struct ast_trans_pvt *pvt, const SpeexMode *profile)
{
struct speex_coder_pvt *tmp = pvt->pvt;
-
+
if (!(tmp->speex = speex_decoder_init(profile)))
return -1;
};
static struct ast_translator lintospeex = {
- .name = "lintospeex",
+ .name = "lintospeex",
.src_codec = {
.name = "slin",
.type = AST_MEDIA_TYPE_AUDIO,
.name = "slin",
.type = AST_MEDIA_TYPE_AUDIO,
.sample_rate = 16000,
- },
+ },
.format = "slin16",
.newpvt = speexwbtolin16_new,
.framein = speextolin_framein,
.buf_size = BUFFER_SAMPLES * 2, /* XXX maybe a lot less ? */
};
-static int parse_config(int reload)
+static int parse_config(int reload)
{
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
struct ast_config *cfg = ast_config_load("codecs.conf", config_flags);
if (res > -1 && res < 11) {
ast_verb(3, "CODEC SPEEX: Setting Quality to %d\n",res);
quality = res;
- } else
+ } else
ast_log(LOG_ERROR,"Error Quality must be 0-10\n");
} else if (!strcasecmp(var->name, "complexity")) {
res = abs(atoi(var->value));
if (res > -1 && res < 11) {
ast_verb(3, "CODEC SPEEX: Setting Complexity to %d\n",res);
complexity = res;
- } else
+ } else
ast_log(LOG_ERROR,"Error! Complexity must be 0-10\n");
} else if (!strcasecmp(var->name, "vbr_quality")) {
if (sscanf(var->value, "%30f", &res_f) == 1 && res_f >= 0 && res_f <= 10) {
else
ast_verb(3, "CODEC SPEEX: Disabling ABR\n");
abr = res;
- } else
+ } else
ast_log(LOG_ERROR,"Error! ABR target bitrate must be >= 0\n");
} else if (!strcasecmp(var->name, "vad")) {
vad = ast_true(var->value) ? 1 : 0;
return 0;
}
-static int reload(void)
+static int reload(void)
{
if (parse_config(1))
return AST_MODULE_LOAD_DECLINE;
/*! \file
*
* \brief codec_ulaw.c - translate between signed linear and ulaw
- *
+ *
* \ingroup codecs
*/
*/
static uint8_t ex_ilbc[] = {
- 0xff, 0xa0, 0xff, 0xfa, 0x0f, 0x60, 0x12, 0x11, 0xa2, 0x47,
- 0x22, 0x8c, 0x00, 0x00, 0x01, 0x02, 0x80, 0x43, 0xa0, 0x40,
- 0x33, 0xff, 0xcf, 0xc0, 0xf3, 0xf3, 0x3f, 0x8f, 0x3f, 0xff,
- 0xff, 0xff, 0xff, 0xfc, 0xf9, 0xe5, 0x55, 0x78, 0x0b, 0xca,
+ 0xff, 0xa0, 0xff, 0xfa, 0x0f, 0x60, 0x12, 0x11, 0xa2, 0x47,
+ 0x22, 0x8c, 0x00, 0x00, 0x01, 0x02, 0x80, 0x43, 0xa0, 0x40,
+ 0x33, 0xff, 0xcf, 0xc0, 0xf3, 0xf3, 0x3f, 0x8f, 0x3f, 0xff,
+ 0xff, 0xff, 0xff, 0xfc, 0xf9, 0xe5, 0x55, 0x78, 0x0b, 0xca,
0xe1, 0x27, 0x94, 0x7b, 0xa8, 0x91, 0x2c, 0x36, 0x08, 0x56,
};
*
* Copyright (C) 2005 Steve Underwood
*
- * Despite my general liking of the GPL, I place my own contributions
+ * Despite my general liking of the GPL, I place my own contributions
* to this code in the public domain for the benefit of all mankind -
* even the slimy ones who might try to proprietize my work and use it
* to my detriment.
int nb;
int det;
} band[2];
-
+
unsigned int in_buffer;
int in_bits;
unsigned int out_buffer;
*
* Copyright (C) 2005 Steve Underwood
*
- * Despite my general liking of the GPL, I place my own contributions
+ * Despite my general liking of the GPL, I place my own contributions
* to this code in the public domain for the benefit of all mankind -
* even the slimy ones who might try to proprietize my work and use it
* to my detriment.
s->band[band].d[i] = s->band[band].d[i - 1];
s->band[band].b[i] = s->band[band].bp[i];
}
-
+
for (i = 2; i > 0; i--)
{
s->band[band].r[i] = s->band[band].r[i - 1];
static const int wh[3] = {0, -214, 798};
static const int rh2[4] = {2, 1, 2, 1};
static const int qm2[4] = {-7408, -1616, 7408, 1616};
- static const int qm4[16] =
+ static const int qm4[16] =
{
- 0, -20456, -12896, -8968,
+ 0, -20456, -12896, -8968,
-6288, -4240, -2584, -1200,
20456, 12896, 8968, 6288,
4240, 2584, 1200, 0
else if (wd1 > 18432)
wd1 = 18432;
s->band[0].nb = wd1;
-
+
/* Block 3L, SCALEL */
wd1 = (s->band[0].nb >> 6) & 31;
wd2 = 8 - (s->band[0].nb >> 11);
s->band[0].det = wd3 << 2;
block4(s, 0, dlowt);
-
+
if (!s->eight_k)
{
/* Block 2H, INVQAH */
else if (wd1 > 22528)
wd1 = 22528;
s->band[1].nb = wd1;
-
+
/* Block 3H, SCALEH */
wd1 = (s->band[1].nb >> 6) & 31;
wd2 = 10 - (s->band[1].nb >> 11);
*
* All rights reserved.
*
- * Despite my general liking of the GPL, I place my own contributions
+ * Despite my general liking of the GPL, I place my own contributions
* to this code in the public domain for the benefit of all mankind -
* even the slimy ones who might try to proprietize my work and use it
* to my detriment.
s->band[band].d[i] = s->band[band].d[i - 1];
s->band[band].b[i] = s->band[band].bp[i];
}
-
+
for (i = 2; i > 0; i--)
{
s->band[band].r[i] = s->band[band].r[i - 1];
s->x[i] = s->x[i + 2];
s->x[22] = amp[j++];
s->x[23] = amp[j++];
-
+
/* Discard every other QMF output */
sumeven = 0;
sumodd = 0;
s->band[0].det = wd3 << 2;
block4(s, 0, dlow);
-
+
if (s->eight_k)
{
/* Just leave the high bits as zero */
# LTP_CUT = -DLTP_CUT
LTP_CUT =
-######### Define to enable the GSM library's long-term correlation
+######### Define to enable the GSM library's long-term correlation
######### approximation option---faster, but worse; works for
######### both integer and floating point multiplications.
######### This flag is still in the experimental stage.
WAV49 = -DWAV49
#WAV49 =
-######### Define to enable the GSM library's option to pack GSM frames
+######### Define to enable the GSM library's option to pack GSM frames
######### in the style used by the WAV #49 format. If you want to write
######### a tool that produces .WAV files which contain GSM-encoded data,
######### define this, and read about the GSM_OPT_WAV49 option in the
######### Define to enable MMXTM optimizations for x86 architecture CPU's
######### which support MMX instructions. This should be newer pentiums,
######### ppro's, etc, as well as the AMD K6 and K7. The compile will
-######### probably require gcc.
+######### probably require gcc.
# Due to the gsm codec beeing broken when compiled with gcc version 4.2
# and optimization higher than -O2 we are checking for that version and
PG =
#PG = -g -pg
######### Profiling flags. If you don't know what that means, leave it blank.
-
+
# Choose a compiler. The code works both with ANSI and K&R-C.
# Use -DNeedFunctionPrototypes to compile with, -UNeedFunctionPrototypes to
# compile without, function prototypes in the header files.
RMFLAGS = -f
FIND = find
COMPRESS = compress
-COMPRESSFLAGS =
+COMPRESSFLAGS =
# RANLIB = true
RANLIB = ranlib
#
# You shouldn't have to configure below this line if you're porting.
-#
+#
# Local Directories
# format used by the tests we ran (.cod). We paid for the test data,
# so I guess we can't just provide them with this package. Still,
# if you happen to have them lying around, here's the code.
-#
+#
# You can use gsm2cod | cod2txt independently to look at what's
# coded inside the compressed frames, although this shouldn't be
# hard to roll on your own using the gsm_print() function from
$(TST)/test-result: $(TST)/lin2cod $(TST)/cod2lin $(TOAST) $(TST)/run
- ( cd $(TST); ./run )
+ ( cd $(TST); ./run )
$(TST)/lin2txt: $(TST)/lin2txt.o $(LIBGSM)
$(LD) $(LFLAGS) -o $(TST)/lin2txt \
with typical UNIX applications, our implementation turns frames of 160
16-bit linear samples into 33-byte frames (1650 Bytes/s).
The quality of the algorithm is good enough for reliable speaker
-recognition; even music often survives transcoding in recognizable
+recognition; even music often survives transcoding in recognizable
form (given the bandwidth limitations of 8 kHz sampling rate).
The interfaces offered are a front end modelled after compress(1), and
#define GSM_OPT_FRAME_CHAIN 6
extern gsm gsm_create GSM_P((void));
-extern void gsm_destroy GSM_P((gsm));
+extern void gsm_destroy GSM_P((gsm));
extern int gsm_print GSM_P((FILE *, gsm, gsm_byte *));
extern int gsm_option GSM_P((gsm, int, int *));
extern word gsm_asr P((word a, int n));
/*
- * Inlined functions from add.h
+ * Inlined functions from add.h
*/
-/*
+/*
* #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \
* (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))
*/
static __inline__ int GSM_L_ADD(int a, int b)
{
__asm__ __volatile__(
-
+
"addl %2,%0; jno 0f; movl $0x7fffffff,%0; adcl $0,%0; 0:"
: "=&r" (a)
: "0" (a), "ir" (b)
#ifdef WIN32
#define inline __inline
#define __inline__ __inline
-#endif
+#endif
# define GSM_L_ADD(a, b) \
( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \
extern void Gsm_Encoding P((
struct gsm_state * S,
- word * e,
- word * ep,
+ word * e,
+ word * ep,
word * xmaxc,
- word * Mc,
+ word * Mc,
word * xMc));
extern void Gsm_Short_Term_Analysis_Filter P((
# define P1(x, a) (a)
# define P2(x, a, b) (a, b)
# define P3(x, a, b, c) (a, b, c)
-# define P4(x, a, b, c, d) (a, b, c, d)
+# define P4(x, a, b, c, d) (a, b, c, d)
# define P5(x, a, b, c, d, e) (a, b, c, d, e)
# define P6(x, a, b, c, d, e, f) (a, b, c, d, e, f)
# define P7(x, a, b, c, d, e, f, g) (a, b, c, d, e, f, g)
}
else if (b <= 0) return a - b;
else {
- /* a<0, b>0 */
+ /* a<0, b>0 */
ulongword A = (ulongword)-(a + 1) + b;
return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
* variable L_var1 for positive values on the interval
*
* with minimum of
- * minimum of 1073741824 (01000000000000000000000000000000) and
+ * minimum of 1073741824 (01000000000000000000000000000000) and
* maximum of 2147483647 (01111111111111111111111111111111)
*
*
a = ~a;
}
- return a & 0xffff0000
+ return a & 0xffff0000
? ( a & 0xff000000
? -1 + bitoff[ 0xFF & (a >> 24) ]
: 7 + bitoff[ 0xFF & (a >> 16) ] )
# endif
}
-/*
+/*
* (From p. 46, end of section 4.2.5)
*
* NOTE: The following lines gives [sic] one correct implementation
#include "gsm.h"
#include "proto.h"
-/*
- * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
+/*
+ * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER
*/
void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
* The RPE-LTD coder works on a frame by frame basis. The length of
* the frame is equal to 160 samples. Some computations are done
* once per frame to produce at the output of the coder the
- * LARc[1..8] parameters which are the coded LAR coefficients and
+ * LARc[1..8] parameters which are the coded LAR coefficients and
* also to realize the inverse filtering operation for the entire
* frame (160 samples of signal d[0..159]). These parts produce at
* the output of the coder:
#include <stdio.h>
#include "proto.h"
-void gsm_debug_words P4( (name, from, to, ptr),
+void gsm_debug_words P4( (name, from, to, ptr),
char * name,
int from,
int to,
xmaxc[2] = sr & 0x3f; sr >>= 6;
xmc[26] = sr & 0x7; sr >>= 3;
xmc[27] = sr & 0x7; sr >>= 3;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
xmc[28] = sr & 0x7; sr >>= 3;
xmc[29] = sr & 0x7; sr >>= 3;
xmc[30] = sr & 0x7; sr >>= 3;
xmc[38] = sr & 0x7; sr >>= 3;
sr = *c++;
Nc[3] = sr & 0x7f; sr >>= 7;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
bc[3] = sr & 0x3; sr >>= 2;
Mc[3] = sr & 0x3; sr >>= 2;
sr |= (uword)*c++ << 5;
#define xmc (target + 46 - 26)
xmc[26] = sr & 0x7; sr >>= 3;
xmc[27] = sr & 0x7; sr >>= 3;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
xmc[28] = sr & 0x7; sr >>= 3;
xmc[29] = sr & 0x7; sr >>= 3;
xmc[30] = sr & 0x7; sr >>= 3;
xmc[38] = sr & 0x7; sr >>= 3;
sr = *c++;
Nc[3] = sr & 0x7f; sr >>= 7;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
bc[3] = sr & 0x3; sr >>= 2;
Mc[3] = sr & 0x3; sr >>= 2;
sr |= (uword)*c++ << 5;
xmc[51] = sr & 0x7; sr >>= 3;
}
}
- else
+ else
#endif
{
/* GSM_MAGIC = (*c >> 4) & 0xF; */
#define xmc (source + 46 - 26)
xmc[26] = sr & 0x7; sr >>= 3;
xmc[27] = sr & 0x7; sr >>= 3;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
xmc[28] = sr & 0x7; sr >>= 3;
xmc[29] = sr & 0x7; sr >>= 3;
xmc[30] = sr & 0x7; sr >>= 3;
xmc[38] = sr & 0x7; sr >>= 3;
sr = *c++;
Nc[3] = sr & 0x7f; sr >>= 7;
- sr |= (uword)*c++ << 1;
+ sr |= (uword)*c++ << 1;
bc[3] = sr & 0x3; sr >>= 2;
Mc[3] = sr & 0x3; sr >>= 2;
sr |= (uword)*c++ << 5;
}
}
else
-#endif
+#endif
{
*c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */
case GSM_OPT_WAV49:
-#ifdef WAV49
+#ifdef WAV49
result = r->wav_fmt;
if (val) r->wav_fmt = !!*val;
#endif
/* k6opt.h vector functions optimized for MMX extensions to x86
*
* Copyright (C) 1999 by Stanley J. Brooks <stabro@megsinet.net>
- *
+ *
* Any use of this software is permitted provided that this notice is not
* removed and that neither the authors nor the Technische Universitaet Berlin
* are deemed to have made any representations as to the suitability of this
* this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE;
* not even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE.
- *
+ *
* Chicago, 03.12.1999
* Stanley J. Brooks
*/
extern longword k6maxcc P3((wt,dp,Nc_out),
const word *wt,
- const word *dp,
+ const word *dp,
word * Nc_out /* OUT */
)
;
*/
extern longword k6maxmin P3((p,n,out),
const word *p,
- int n,
+ int n,
word *out /* out[0] is max, out[1] is min */
)
;
*/
extern void k6vsraw P3((p,n,bits),
const word *p,
- int n,
+ int n,
int bits
)
;
*/
extern void k6vsllw P3((p,n,bits),
const word *p,
- int n,
+ int n,
int bits
)
;
else scal = 6 - temp;
assert(scal >= 0);
- ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100;
+ ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100;
/* Initialization of a working array wt
register float a = lp[-8], b = lp[-7], c = lp[-6],
d = lp[-5], e = lp[-4], f = lp[-3],
g = lp[-2], h = lp[-1];
- register float E;
+ register float E;
register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
S5 = 0, S6 = 0, S7 = 0, S8 = 0;
register float a = lp[-8], b = lp[-7], c = lp[-6],
d = lp[-5], e = lp[-4], f = lp[-3],
g = lp[-2], h = lp[-1];
- register float E;
+ register float E;
register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
S5 = 0, S6 = 0, S7 = 0, S8 = 0;
register float a = lp[-8], b = lp[-7], c = lp[-6],
d = lp[-5], e = lp[-4], f = lp[-3],
g = lp[-2], h = lp[-1];
- register float E;
+ register float E;
register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
S5 = 0, S6 = 0, S7 = 0, S8 = 0;
case 0: STEP( 3277 ); break;
case 1: STEP( 11469 ); break;
case 2: STEP( 21299 ); break;
- case 3: STEP( 32767 ); break;
+ case 3: STEP( 32767 ); break;
}
}
assert( dpp); assert( Nc ); assert( bc );
#if defined(FAST) && defined(USE_FLOAT_MUL)
- if (S->fast)
+ if (S->fast)
#if defined (LTP_CUT)
if (S->ltp_cut)
Cut_Fast_Calculation_of_the_LTP_parameters(S,
else
#endif /* LTP_CUT */
Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
- else
+ else
#endif /* FAST & USE_FLOAT_MUL */
#ifdef LTP_CUT
if (S->ltp_cut)
*/
brp = gsm_QLB[ bcr ];
- /* Computation of the reconstructed short term residual
+ /* Computation of the reconstructed short term residual
* signal drp[0..39]
*/
assert(brp != MIN_WORD);
float_s[k] = (float) \
(s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
break;
-# else
+# else
# define SCALE(n) \
case n: for (k = 0; k <= 159; k++) \
s[k] = (word)GSM_MULT_R( s[k], 16384 >> (n-1) );\
STEP(5); STEP(6); STEP(7); STEP(8);
}
- for (k = 9; k--; L_ACF[k] <<= 1) ;
+ for (k = 9; k--; L_ACF[k] <<= 1) ;
}
/* Rescaling of the array s[0..159]
*/
if (scalauto > 0) {
- assert(scalauto <= 4);
+ assert(scalauto <= 4);
#ifndef K6OPT
for (k = 160; k--; *s++ <<= scalauto) ;
# else /* K6OPT */
assert(*r >= 0);
if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */
assert (*r != MIN_WORD);
- if (n == 8) return;
+ if (n == 8) return;
/* Schur recursion
*/
/* This procedure needs four tables; the following equations
* give the optimum scaling for the constants:
- *
+ *
* A[0..7] = integer( real_A[0..7] * 1024 )
* B[0..7] = integer( real_B[0..7] * 512 )
* MAC[0..7] = maximum of the LARc[0..7]
#include "proto.h"
/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION
- *
+ *
* After A-law to linear conversion (or directly from the
* Ato D converter) the following scaling is assumed for
* input to the RPE-LTP algorithm:
* Where S is the sign bit, v a valid bit, and * a "don't care" bit.
* The original signal is called sop[..]
*
- * out: 0.1................... 12
+ * out: 0.1................... 12
* S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
*/
/* 4.2.2 Offset compensation
- *
+ *
* This part implements a high-pass filter and requires extended
* arithmetic precision for the recursive part of this filter.
* The input of this procedure is the array so[0...159] and the
*/
{
word msp;
-#ifndef __GNUC__
+#ifndef __GNUC__
word lsp;
#endif
longword L_s2;
longword L_temp;
-
+
L_s2 = s1;
L_s2 <<= 15;
-#ifndef __GNUC__
+#ifndef __GNUC__
msp = (word)SASR( L_z2, 15 );
lsp = (word)(L_z2 & 0x7fff); /* gsm_L_sub(L_z2,(msp<<15)); */
* The coefficients of the weighting filter are stored in a table
* (see table 4.4). The following scaling is used:
*
- * H[0..10] = integer( real_H[ 0..10] * 8192 );
+ * H[0..10] = integer( real_H[ 0..10] * 8192 );
*/
{
/* word wt[ 50 ]; */
e -= 5;
/* Compute the signal x[0..39]
- */
+ */
for (k = 0; k <= 39; k++) {
L_result = 8192 >> 1;
#define STEP( i, H ) (e[ k + i ] * (longword)H)
/* Every one of these multiplications is done twice --
- * but I don't see an elegant way to optimize this.
+ * but I don't see an elegant way to optimize this.
* Do you?
*/
L_result += STEP( 10, -134 ) ;
#else
L_result +=
- STEP( 0, -134 )
- + STEP( 1, -374 )
+ STEP( 0, -134 )
+ + STEP( 1, -374 )
/* + STEP( 2, 0 ) */
- + STEP( 3, 2054 )
- + STEP( 4, 5741 )
- + STEP( 5, 8192 )
- + STEP( 6, 5741 )
- + STEP( 7, 2054 )
+ + STEP( 3, 2054 )
+ + STEP( 4, 5741 )
+ + STEP( 5, 8192 )
+ + STEP( 6, 5741 )
+ + STEP( 7, 2054 )
/* + STEP( 8, 0 ) */
- + STEP( 9, -374 )
+ + STEP( 9, -374 )
+ STEP(10, -134 )
;
#endif
/* 4.2.14 */
static void RPE_grid_selection P3((x,xM,Mc_out),
- word * x, /* [0..39] IN */
+ word * x, /* [0..39] IN */
word * xM, /* [0..12] OUT */
word * Mc_out /* OUT */
)
* L_temp = GSM_L_MULT( temp1, temp1 );
* L_result = GSM_L_ADD( L_temp, L_result );
* }
- *
+ *
* if (L_result > EM) {
* Mc = m;
* EM = L_result;
* can be calculated by using the exponent and the mantissa part of
* xmaxc (logarithmic table).
* So, this method avoids any division and uses only a scaling
- * of the RPE samples by a function of the exponent. A direct
+ * of the RPE samples by a function of the exponent. A direct
* multiplication by the inverse of the mantissa (NRFAC[0..7]
* found in table 4.5) gives the 3 bit coded version xMc[0..12]
* of the RPE samples.
*/
assert( exp <= 4096 && exp >= -4096);
- assert( mant >= 0 && mant <= 7 );
+ assert( mant >= 0 && mant <= 7 );
temp1 = 6 - exp; /* normalization by the exponent */
temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */
word mant,
word exp,
register word * xMp) /* [0..12] OUT */
-/*
+/*
* This part is for decoding the RPE sequence of coded xMc[0..12]
* samples to obtain the xMp[0..12] array. Table 4.6 is used to get
* the mantissa of xmaxc (FAC[0..7]).
int i;
word temp, temp1, temp2, temp3;
- assert( mant >= 0 && mant <= 7 );
+ assert( mant >= 0 && mant <= 7 );
temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */
temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */
{
int k;
- for (k = 0; k <= 79; k++)
+ for (k = 0; k <= 79; k++)
dp[ -120 + k ] = dp[ -80 + k ];
for (k = 0; k <= 39; k++)
}
/* 4.2.9 */
-/* Computation of the quantized reflection coefficients
+/* Computation of the quantized reflection coefficients
*/
/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8]
Coefficients_40_159( LARpp_j, LARp);
LARp_to_rp( LARp );
FILTER( S->u, LARp, 120, s + 40);
-
+
}
void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
-/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax
+/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax
*/
/* i 0 1 2 3 4 5 6 7 */
word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
length*sizeof(float));
}
-
-
-
-
-
-
);
#endif
-
-
-
-
-
-
-
-
-
-
-
-
lsf, lsfdeq, iLBCenc_inst->lsfold,
iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst);
}
-
out[k] = fout[len-1-k]+fout[2*len-1-k];
}
}
-
-
-
-
-
-
-
-
-
-
-
-
AbsQuantW(iLBCenc_inst, fout,syntDenum,
weightDenum,idxVec, len, state_first);
}
-
-
-
-
-
-
-
-
-
-
-
memcpy(mem, &In[len-LPC_FILTERORDER],
LPC_FILTERORDER*sizeof(float));
}
-
(float)1.786499, (float)2.041748, (float)2.290405, (float)2.650757,
(float)1.938232, (float)2.264404, (float)2.529053, (float)2.796143
};
-
memcpy(iLBCdec_inst->prevResidual, PLCresidual,
iLBCdec_inst->blockl*sizeof(float));
}
-
srcname = $2;
printf("creating source file %s\n", srcname);
}else if (srcname != "nothing") {
- if (/Andersen,* *et* *al\./)
+ if (/Andersen,* *et* *al\./)
printf("skipping %s\n", $0);
else if (/\f/)
printf("skipping2 %s\n", $0);
return 0.0;
}
-
-
-
-
-
-
}
gain_index[0]=j;
}
-
-
-
-
-
-
-
-
-
iLBCdec_inst->prev_enh_pl=1;
}
}
-
} iLBC_Dec_Inst_t;
#endif
-
will treat it as a lost frame) */
dopack( &pbytes, 0, 1, &pos);
}
-
a_coef[0] = 1.0;
}
-
-
-
-
-
-
-
Andersen, et al. Experimental [Page 1]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 2]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 3]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 4]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 5]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 6]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 7]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 8]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 9]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 10]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 11]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 12]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 13]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 14]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 15]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 16]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 17]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 18]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 19]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 20]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 21]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 22]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 23]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 24]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 25]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 26]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 27]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 28]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 29]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 30]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 31]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 32]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 33]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 34]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 35]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 36]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 37]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 38]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 39]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 40]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 41]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 42]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 43]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 44]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 45]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 46]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 47]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 48]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 49]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 50]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 51]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 52]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 53]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 54]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 55]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 56]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 57]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 58]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 59]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 60]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 61]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 62]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 63]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 64]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 65]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 66]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 67]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 68]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 69]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 70]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 71]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 72]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 73]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 74]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 75]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 76]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 77]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 78]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 79]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 80]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 81]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 82]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 83]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 84]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 85]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 86]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 87]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 88]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 89]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 90]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 91]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 92]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 93]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 94]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 95]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 96]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 97]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 98]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 99]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 100]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 101]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 102]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 103]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 104]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 105]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 106]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 107]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 108]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 109]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 110]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 111]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 112]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 113]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 114]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 115]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 116]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 117]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 118]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 119]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 120]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 121]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 122]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 123]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 124]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 125]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 126]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 127]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 128]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 129]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 130]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 131]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 132]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 133]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 134]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 135]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 136]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 137]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 138]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 139]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 140]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 141]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 142]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 143]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 144]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 145]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 146]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 147]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 148]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 149]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 150]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 151]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 152]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 153]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 154]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 155]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 156]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 157]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 158]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 159]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 160]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 161]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 162]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 163]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 164]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 165]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 166]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 167]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 168]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 169]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 170]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 171]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 172]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 173]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 174]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 175]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 176]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 177]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 178]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 179]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 180]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 181]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 182]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 183]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 184]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 185]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 186]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 187]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 188]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 189]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 190]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 191]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 192]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 193]
-\f
+
RFC 3951 Internet Low Bit Rate Codec December 2004
Andersen, et al. Experimental [Page 194]
-\f
memcpy(mem, &Out[len-LPC_FILTERORDER],
LPC_FILTERORDER*sizeof(float));
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*! \file
+/*! \file
* \brief log2comp.h - various base 2 log computation versions
- *
+ *
* Asterisk -- An open source telephony toolkit.
*
* \author Alex Volkov <codepro@usa.net>
static inline int ilog2(int val)
{
int a;
- __asm__ ("cntlzw %0,%1"
- : "=r" (a)
+ __asm__ ("cntlzw %0,%1"
+ : "=r" (a)
: "r" (val)
);
return 31-a;
-#
+#
# Makefile for LPC-10 speech coder library (unix)
-#
+#
# default C compiler
CC?= gcc
-#
+#
# These definitions for CFLAGS and LIB_TARGET_DIR are used when one
# runs make in the lpc10 directory, without environment variables that
# override them. When make is run in this directory from a makefile
# for an application that uses the LPC10 coder, there are environment
# variables set for CFLAGS and LIB_TARGET_DIR that override these
# definitions.
-#
+#
LIB_TARGET_DIR = .
-#
+#
# -I$(LIB_TARGET_DIR) option needed so that #include "machine.h"
# directives can find the machine.h file.
-#
+#
CFLAGS+= -fPIC -Wno-comment
/* This entry has no local state. It accesses a "constant" array */
/* declared in ANALYS. */
-/* Subroutine */ int analys_(real *speech, integer *voice, integer
+/* Subroutine */ int analys_(real *speech, integer *voice, integer
*pitch, real *rms, real *rc, struct lpc10_encoder_state *st)
{
/* Initialized data */
extern int dcbias_(integer *, real *, real *);
integer ipitch;
integer *obound;
- extern /* Subroutine */ int preemp_(real *, real *, integer *, real *,
- real *), voicin_(integer *, real *, real *, integer *, integer *,
+ extern /* Subroutine */ int preemp_(real *, real *, integer *, real *,
+ real *), voicin_(integer *, real *, real *, integer *, integer *,
real *, real *, integer *, real *, integer *, integer *, integer *,
struct lpc10_encoder_state *);
integer *voibuf;
real *rmsbuf;
extern /* Subroutine */ int lpfilt_(real *, real *, integer *, integer *),
ivfilt_(real *, real *, integer *, integer *, real *), energy_(
- integer *, real *, real *), invert_(integer *, real *, real *,
+ integer *, real *, real *), invert_(integer *, real *, real *,
real *);
integer minptr, maxptr;
- extern /* Subroutine */ int dyptrk_(real *, integer *, integer *, integer
+ extern /* Subroutine */ int dyptrk_(real *, integer *, integer *, integer
*, integer *, integer *, struct lpc10_encoder_state *);
real phi[100] /* was [10][10] */, psi[10];
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* The tables TAU and BUFLIM, and the variable PRECOEF, are not */
/* Fortran PARAMETER's, but they are initialized with DATA */
/* statements, and never modified. Thus, they need not have SAVE */
-/* statements for them to keep their values from one invocation to
+/* statements for them to keep their values from one invocation to
*/
/* the next. */
/* Local variables that need not be saved */
vwin[(i__ << 1) - 1] = vwin[((i__ + 1) << 1) - 1] - contrl_1.lframe;
awin[(i__ << 1) - 2] = awin[((i__ + 1) << 1) - 2] - contrl_1.lframe;
awin[(i__ << 1) - 1] = awin[((i__ + 1) << 1) - 1] - contrl_1.lframe;
-/* EWIN(*,J) is unused for J .NE. AF, so the following shift is
+/* EWIN(*,J) is unused for J .NE. AF, so the following shift is
*/
/* unnecessary. It also causes error messages when the C versio
n */
-/* of the code created from this by f2c is run with Purify. It
+/* of the code created from this by f2c is run with Purify. It
*/
-/* correctly complains that uninitialized memory is being read.
+/* correctly complains that uninitialized memory is being read.
*/
/* EWIN(1,I) = EWIN(1,I+1) - LFRAME */
/* EWIN(2,I) = EWIN(2,I+1) - LFRAME */
}
/* Copy input speech, scale to sign+12 bit integers */
/* Remove long term DC bias. */
-/* If the average value in the frame was over 1/4096 (after current
+/* If the average value in the frame was over 1/4096 (after current
*/
/* BIAS correction), then subtract that much more from samples in */
/* next frame. If the average value in the frame was under */
-/* -1/4096, add 1/4096 more to samples in next frame. In all other
+/* -1/4096, add 1/4096 more to samples in next frame. In all other
*/
/* cases, keep BIAS the same. */
temp = 0.f;
i__1 = contrl_1.lframe;
for (i__ = 1; i__ <= i__1; ++i__) {
- inbuf[720 - contrl_1.lframe + i__ - 181] = speech[i__] * 4096.f -
+ inbuf[720 - contrl_1.lframe + i__ - 181] = speech[i__] * 4096.f -
(*bias);
temp += inbuf[720 - contrl_1.lframe + i__ - 181];
}
}
/* Place Voicing Window */
i__ = 721 - contrl_1.lframe;
- preemp_(&inbuf[i__ - 181], &pebuf[i__ - 181], &contrl_1.lframe, &precoef,
+ preemp_(&inbuf[i__ - 181], &pebuf[i__ - 181], &contrl_1.lframe, &precoef,
zpre);
onset_(pebuf, osbuf, osptr, &c__10, &c__181, &c__720, &contrl_1.lframe, st);
/* MAXOSP = MAX( MAXOSP, OSPTR ) */
- placev_(osbuf, osptr, &c__10, &obound[2], vwin, &c__3, &contrl_1.lframe,
+ placev_(osbuf, osptr, &c__10, &obound[2], vwin, &c__3, &contrl_1.lframe,
&c__90, &c__156, &c__307, &c__462);
-/* The Pitch Extraction algorithm estimates the pitch for a frame
+/* The Pitch Extraction algorithm estimates the pitch for a frame
*/
/* of speech by locating the minimum of the average magnitude difference
*/
/* function (AMDF). The AMDF operates on low-pass, inverse filtered */
-/* speech. (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR
+/* speech. (The low-pass filter is an 800 Hz, 19 tap, equiripple, FIR
*/
-/* filter and the inverse filter is a 2nd-order LPC filter.) The pitch
+/* filter and the inverse filter is a 2nd-order LPC filter.) The pitch
*/
-/* estimate is later refined by dynamic programming (DYPTRK). However,
+/* estimate is later refined by dynamic programming (DYPTRK). However,
*/
/* since some of DYPTRK's parameters are a function of the voicing */
/* decisions, a voicing decision must precede the final pitch estimation.
*/
/* See subroutines LPFILT, IVFILT, and TBDM. */
/* LPFILT reads indices LBUFH-LFRAME-29 = 511 through LBUFH = 720 */
-/* of INBUF, and writes indices LBUFH+1-LFRAME = 541 through LBUFH
+/* of INBUF, and writes indices LBUFH+1-LFRAME = 541 through LBUFH
*/
/* = 720 of LPBUF. */
lpfilt_(&inbuf[228], &lpbuf[384], &c__312, &contrl_1.lframe);
-/* IVFILT reads indices (PWINH-LFRAME-7) = 353 through PWINH = 540
+/* IVFILT reads indices (PWINH-LFRAME-7) = 353 through PWINH = 540
*/
/* of LPBUF, and writes indices (PWINH-LFRAME+1) = 361 through */
/* PWINH = 540 of IVBUF. */
ivfilt_(&lpbuf[204], ivbuf, &c__312, &contrl_1.lframe, ivrc);
/* TBDM reads indices PWINL = 229 through */
-/* (PWINL-1)+MAXWIN+(TAU(LTAU)-TAU(1))/2 = 452 of IVBUF, and writes
+/* (PWINL-1)+MAXWIN+(TAU(LTAU)-TAU(1))/2 = 452 of IVBUF, and writes
*/
/* indices 1 through LTAU = 60 of AMDF. */
tbdm_(ivbuf, &c__156, tau, &c__60, amdf, &minptr, &maxptr, &mintau);
-/* Voicing decisions are made for each half frame of input speech.
+/* Voicing decisions are made for each half frame of input speech.
*/
/* An initial voicing classification is made for each half of the */
/* analysis frame, and the voicing decisions for the present frame */
/* maximum-to-minimum ratio, the zero crossing rate, energy measures, */
/* reflection coefficients, and prediction gains. */
/* The pitch and voicing rules apply smoothing and isolated */
-/* corrections to the pitch and voicing estimates and, in the process,
+/* corrections to the pitch and voicing estimates and, in the process,
*/
-/* introduce two frames of delay into the corrected pitch estimates and
+/* introduce two frames of delay into the corrected pitch estimates and
*/
/* voicing decisions. */
for (half = 1; half <= 2; ++half) {
/* reinitialize its state for any other reason, call the ENTRY */
/* INITBSYNZ. */
-/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv,
+/* Subroutine */ int bsynz_(real *coef, integer *ip, integer *iv,
real *sout, real *rms, real *ratio, real *g2pass,
struct lpc10_decoder_state *st)
{
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Function return value definitions */
/* Parameters/constants */
-/* KEXC is not a Fortran PARAMETER, but it is an array initialized
+/* KEXC is not a Fortran PARAMETER, but it is an array initialized
*/
/* with a DATA statement that is never modified. */
/* Local variables that need not be saved */
-/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices
+/* NOISE is declared with range (1:MAXPIT+MAXORD), but only indices
*/
/* ORDER+1 through ORDER+IP are ever used, and I think that IP */
/* .LE. MAXPIT. Why not declare it to be in the range (1:MAXPIT) */
/* Impulse doublet excitation for plosives */
/* (RANDOM()+32768) is in the range 0 to 2**16-1. Therefore the
*/
-/* following expression should be evaluated using integers with
+/* following expression should be evaluated using integers with
at */
/* least 32 bits (16 isn't enough), and PX should be in the rang
e */
/* R5-1, R6-1, R7-2, R9-0, P-5, */
/* R5-2, R6-2,R10-1, R8-2, P-6, R9-1, */
/* R5-3, R6-3, R7-3, R9-2, R8-3, SYNC */
-/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
+/* Subroutine */ int chanwr_0_(int n__, integer *order, integer *ipitv,
integer *irms, integer *irc, integer *ibits,
struct lpc10_encoder_state *st)
{
/* Arguments */
/* Parameters/constants */
/* These arrays are not Fortran PARAMETER's, but they are defined */
-/* by DATA statements below, and their contents are never altered.
+/* by DATA statements below, and their contents are never altered.
*/
/* Local variables that need not be saved */
/* Local state */
return 0;
} /* chanwr_ */
-/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
+/* Subroutine */ int chanwr_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits, struct lpc10_encoder_state *st)
{
return chanwr_0_(0, order, ipitv, irms, irc, ibits, st);
}
-/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
+/* Subroutine */ int chanrd_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits)
{
return chanwr_0_(1, order, ipitv, irms, irc, ibits, NULL);
}
return 0;
} /* dcbias_ */
-
*
* Revision 1.15 2003/09/19 01:20:22 markster
* Code cleanups (bug #66)
- *
+ *
* Revision 1.2 2003/09/19 01:20:22 markster
* Code cleanups (bug #66)
*
/* reinitialize its state for any other reason, call the ENTRY */
/* INITDECODE. */
-/* Subroutine */ int decode_(integer *ipitv, integer *irms,
+/* Subroutine */ int decode_(integer *ipitv, integer *irms,
integer *irc, integer *voice, integer *pitch, real *rms, real *rc,
struct lpc10_decoder_state *st)
{
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* The following are used regardless of CORRP's value */
/* The following are used only if CORRP is .TRUE. */
/* I am guessing the initial values for IVP2H, IOVOIC, DRC, DPIT, */
-/* and DRMS. They should be checked to see if they are reasonable.
+/* and DRMS. They should be checked to see if they are reasonable.
*/
-/* I'm also guessing for ERATE, but I think 0 is the right initial
+/* I'm also guessing for ERATE, but I think 0 is the right initial
*/
/* value. */
/* Parameter adjustments */
if (*first) {
*first = FALSE_;
/* Assign PITCH a "default" value on the first call, since */
-/* otherwise it would be left uninitialized. The two lines
+/* otherwise it would be left uninitialized. The two lines
*/
/* below were copied from above, since it seemed like a */
/* reasonable thing to do for the first call. */
*pitch = dpit[1];
/* If bit 2 of ICORF is set then smooth RMS and RC's, */
if ((icorf & bit[1]) != 0) {
- if ((i__1 = drms[1] - drms[0], (real) abs(i__1)) >= corth[ixcor + 3]
+ if ((i__1 = drms[1] - drms[0], (real) abs(i__1)) >= corth[ixcor + 3]
&& (i__2 = drms[1] - drms[2], (real) abs(i__2)) >= corth[
ixcor + 3]) {
*irms = median_(&drms[2], &drms[1], drms);
}
/* If bit 3 of ICORF is set then smooth pitch */
if ((icorf & bit[2]) != 0) {
- if ((i__1 = dpit[1] - dpit[0], (real) abs(i__1)) >= corth[ixcor - 1]
+ if ((i__1 = dpit[1] - dpit[0], (real) abs(i__1)) >= corth[ixcor - 1]
&& (i__2 = dpit[1] - dpit[2], (real) abs(i__2)) >= corth[
ixcor - 1]) {
*pitch = median_(&dpit[2], &dpit[1], dpit);
/* This subroutine has no local state. */
-/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau,
+/* Subroutine */ int difmag_(real *speech, integer *lpita, integer *tau,
integer *ltau, integer *maxlag, real *amdf, integer *minptr, integer *
maxptr)
{
}
return 0;
} /* difmag_ */
-
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* removed. */
/* Local state */
/* It would be a bit more "general" to define S(LTAU), if Fortran */
-/* allows the argument of a function to be used as the dimension of
+/* allows the argument of a function to be used as the dimension of
*/
/* a local array variable. */
/* IPOINT is always in the range 0 to DEPTH-1. */
/* initial values (all indices of P with second index equal to */
/* IPTR are all written before being read in this subroutine). */
-/* From examining the code carefully, it appears that all of these
+/* From examining the code carefully, it appears that all of these
*/
/* should be saved from one invocation to the next. */
/* I've run lpcsim with the "-l 6" option to see all of the */
/* debugging information that is printed out by this subroutine */
/* below, and it appears that S, P, IPOINT, and ALPHAX are all */
-/* initialized to 0 (these initial values would likely be different
+/* initialized to 0 (these initial values would likely be different
*/
-/* on different platforms, compilers, etc.). Given that the output
+/* on different platforms, compilers, etc.). Given that the output
*/
/* of the coder sounds reasonable, I'm going to initialize these */
/* variables to 0 explicitly. */
/* Function Body */
-/* Calculate the confidence factor ALPHA, used as a threshold slope in
+/* Calculate the confidence factor ALPHA, used as a threshold slope in
*/
-/* SEESAW. If unvoiced, set high slope so that every point in P array
+/* SEESAW. If unvoiced, set high slope so that every point in P array
*/
/* is marked as a potential pitch frequency. A scaled up version (ALPHAX
)*/
*pitch = p[*pitch + j * 60 - 61];
}
-/* The following statement subtracts one from IPOINT, mod DEPTH. I
+/* The following statement subtracts one from IPOINT, mod DEPTH. I
*/
-/* think the author chose to add DEPTH-1, instead of subtracting 1,
+/* think the author chose to add DEPTH-1, instead of subtracting 1,
*/
-/* because then it will work even if MOD doesn't work as desired on
+/* because then it will work even if MOD doesn't work as desired on
*/
/* negative arguments. */
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
/* These arrays are not Fortran PARAMETER's, but they are defined */
-/* by DATA statements below, and their contents are never altered.
+/* by DATA statements below, and their contents are never altered.
*/
/* Local variables that need not be saved */
/* Parameter adjustments */
/* 801 FORMAT(1X,'<<ENCODE OUT>>',T32,2I3,I6,I5,T50,10I8) */
return 0;
} /* encode_ */
-
*rms = (real)sqrt(*rms / *len);
return 0;
} /* energy_ */
-
#endif
#ifdef P_R_O_T_O_T_Y_P_E_S
-extern int bsynz_(real *coef, integer *ip, integer *iv,
+extern int bsynz_(real *coef, integer *ip, integer *iv,
real *sout, real *rms, real *ratio, real *g2pass,
struct lpc10_decoder_state *st);
extern int chanwr_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits, struct lpc10_encoder_state *st);
extern int chanrd_(integer *order, integer *ipitv, integer *irms,
integer *irc, integer *ibits);
-extern int chanwr_0_(int n__, integer *order, integer *ipitv,
+extern int chanwr_0_(int n__, integer *order, integer *ipitv,
integer *irms, integer *irc, integer *ibits,
struct lpc10_encoder_state *st);
extern int dcbias_(integer *len, real *speech, real *sigout);
-extern int decode_(integer *ipitv, integer *irms, integer *irc,
+extern int decode_(integer *ipitv, integer *irms, integer *irc,
integer *voice, integer *pitch, real *rms,
real *rc, struct lpc10_decoder_state *st);
extern int deemp_(real *x, integer *n, struct lpc10_decoder_state *st);
}
return 0;
} /* ham84_ */
-
/* END DO */
return 0;
} /* invert_ */
-
}
return 0;
} /* irc2pc_ */
-
}
return 0;
} /* ivfilt_ */
-
real z21;
real z12;
real z22;
-
+
/* State used by function analys */
real inbuf[540], pebuf[540];
real lpbuf[696], ivbuf[312];
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
array speech[] is written (indices 0 through
(LPC10_SAMPLES_PER_FRAME-1)).
-
+
*/
struct lpc10_encoder_state * create_lpc10_encoder_state (void);
struct lpc10_decoder_state *st)
{
integer irms, voice[2], pitch, ipitv;
- extern /* Subroutine */ int decode_(integer *, integer *, integer *,
+ extern /* Subroutine */ int decode_(integer *, integer *, integer *,
integer *, integer *, real *, real *, struct lpc10_decoder_state *);
real rc[10];
- extern /* Subroutine */ int chanrd_(integer *, integer *, integer *,
- integer *, integer *), synths_(integer *,
+ extern /* Subroutine */ int chanrd_(integer *, integer *, integer *,
+ integer *, integer *), synths_(integer *,
integer *, real *, real *, real *, integer *,
struct lpc10_decoder_state *);
integer irc[10], len;
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
{
integer irms, voice[2], pitch, ipitv;
real rc[10];
- extern /* Subroutine */ int encode_(integer *, integer *, real *, real *,
- integer *, integer *, integer *), chanwr_(integer *, integer *,
+ extern /* Subroutine */ int encode_(integer *, integer *, real *, real *,
+ integer *, integer *, integer *), chanwr_(integer *, integer *,
integer *, integer *, integer *, struct lpc10_encoder_state *),
- analys_(real *, integer *,
+ analys_(real *, integer *,
integer *, real *, real *, struct lpc10_encoder_state *),
prepro_(real *, integer *, struct lpc10_encoder_state *);
integer irc[10];
*
* Revision 1.14 2003/02/12 13:59:15 matteo
* mer feb 12 14:56:57 CET 2003
- *
+ *
* Revision 1.1.1.1 2003/02/12 13:59:15 matteo
* mer feb 12 14:56:57 CET 2003
*
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
st->z21 = 0.0f;
st->z12 = 0.0f;
st->z22 = 0.0f;
-
+
/* State used by function analys */
for (i = 0; i < 540; i++) {
st->inbuf[i] = 0.0f;
}
return 0;
} /* lpfilt_ */
-
}
return ret_val;
} /* median_ */
-
/* This subroutine has no local state. */
-/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf,
+/* Subroutine */ int mload_(integer *order, integer *awins, integer *awinf,
real *speech, real *phi, real *psi)
{
/* System generated locals */
for (r__ = 2; r__ <= i__1; ++r__) {
i__2 = r__;
for (c__ = 2; c__ <= i__2; ++c__) {
- phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] -
- speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] +
+ phi[r__ + c__ * phi_dim1] = phi[r__ - 1 + (c__ - 1) * phi_dim1] -
+ speech[*awinf + 1 - r__] * speech[*awinf + 1 - c__] +
speech[start - r__] * speech[start - c__];
}
}
/* End correct to get additional elements of PSI */
i__1 = *order - 1;
for (c__ = 1; c__ <= i__1; ++c__) {
- psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start
+ psi[c__] = phi[c__ + 1 + phi_dim1] - speech[start - 1] * speech[start
- 1 - c__] + speech[*awinf] * speech[*awinf - c__];
}
/* Copy lower triangular section into upper (why bother?) */
-/* I'm commenting this out, since the upper triangular half of PHI
+/* I'm commenting this out, since the upper triangular half of PHI
*/
-/* is never used by later code, unless a sufficiently high level of
+/* is never used by later code, unless a sufficiently high level of
*/
/* tracing is turned on. */
/* DO R = 1,ORDER */
/* END DO */
return 0;
} /* mload_ */
-
/* N, D Numerator and denominator of prediction filters */
/* FPC Current prediction coefs */
/* L2BUF, L2SUM1, L2SUM2 State of slope filter */
-/* The only "significant" change I've made is to change L2SUM2 out
+/* The only "significant" change I've made is to change L2SUM2 out
*/
/* of the list of local variables that need to be saved, since it */
/* didn't need to be. */
-/* L2SUM1 need not be, but avoiding saving it would require a small
+/* L2SUM1 need not be, but avoiding saving it would require a small
*/
/* change to the body of the code. See comments below for an */
-/* example of how the code could be changed to avoid saving L2SUM1.
+/* example of how the code could be changed to avoid saving L2SUM1.
*/
/* FPC and LASTI are saved from one invocation to the next, but */
-/* they are not given initial values. This is acceptable, because
+/* they are not given initial values. This is acceptable, because
*/
/* FPC will be assigned a value the first time that this function */
/* is called after D is initialized to 1, since the formula to */
/* change D will not change it to 0 in one step, and the IF (D */
-/* .NE. 0) statement will execute its THEN part, initializing FPC.
+/* .NE. 0) statement will execute its THEN part, initializing FPC.
*/
/* LASTI's value will not be used until HYST is .TRUE., and */
/* whenever HYST is changed from its initial value of .FALSE., */
/* LASTI is assigned a value. */
/* In a C version of this coder, it would be nice if all of these */
-/* saved things, in this and all other subroutines, could be stored
+/* saved things, in this and all other subroutines, could be stored
*/
-/* in a single struct lpc10_coder_state_t, initialized with a call
+/* in a single struct lpc10_coder_state_t, initialized with a call
*/
-/* to a function like lpc10_init(&lpc10_coder_state). In this way,
+/* to a function like lpc10_init(&lpc10_coder_state). In this way,
*/
-/* a program that used these functions could conveniently alternate
+/* a program that used these functions could conveniently alternate
*/
/* coding more than one distinct audio stream. */
}
i__1 = *sbufh;
for (i__ = *sbufh - *lframe + 1; i__ <= i__1; ++i__) {
-/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
+/* Compute FPC; Use old FPC on divide by zero; Clamp FPC to +/- 1.
*/
*n = (pebuf[i__] * pebuf[i__ - 1] + (*n) * 63.f) / 64.f;
/* Computing 2nd power */
}
}
/* Filter FPC */
-/* In order to allow L2SUM1 not to be saved from one invocation
+/* In order to allow L2SUM1 not to be saved from one invocation
of */
/* this subroutine to the next, one could change the sequence of
*/
-/* assignments below, up to the IF statement, to the following.
+/* assignments below, up to the IF statement, to the following.
In */
/* addition, the initial value of L2PTR2 should be changed to */
/* L2WID/2 instead of L2WID/2+1. */
/* RATIO - Previous to present energy ratio */
/* Always assigned a value. */
-/* Subroutine */ int pitsyn_(integer *order, integer *voice,
- integer *pitch, real *rms, real *rc, integer *lframe, integer *ivuv,
+/* Subroutine */ int pitsyn_(integer *order, integer *voice,
+ integer *pitch, real *rms, real *rc, integer *lframe, integer *ivuv,
integer *ipiti, real *rmsi, real *rci, integer *nout, real *ratio,
struct lpc10_decoder_state *st)
{
/* Frame size, Prediction order, Pitch period */
/* Local variables that need not be saved */
/* LSAMP is initialized in the IF (FIRST) THEN clause, but it is */
-/* not used the first time through, and it is given a value before
+/* not used the first time through, and it is given a value before
*/
/* use whenever FIRST is .FALSE., so it appears unnecessary to */
/* assign it a value when FIRST is .TRUE. */
/* JSAMP - If this routine is called N times with identical values of */
/* LFRAME, then the total length of all pitch periods returned */
-/* is always N*LFRAME-JSAMP, and JSAMP is always in the range 0
+/* is always N*LFRAME-JSAMP, and JSAMP is always in the range 0
*/
/* to MAXPIT-1 (see below for why this is so). Thus JSAMP is */
/* the number of samples "left over" from the previous call to */
/* PITSYN, that haven't been "used" in a pitch period returned */
-/* from this subroutine. Every time this subroutine is called,
+/* from this subroutine. Every time this subroutine is called,
*/
/* it returns pitch periods with a total length of at most */
/* LFRAME+JSAMP. */
*nout = *lframe / *pitch;
*jsamp = *lframe - *nout * *pitch;
-/* SYNTHS only calls this subroutine with PITCH in the range
+/* SYNTHS only calls this subroutine with PITCH in the range
20 */
/* to 156. LFRAME = MAXFRM = 180, so NOUT is somewhere in th
e */
vflag = 1;
}
}
-/* Here is the value of most variables that are used below, depending
+/* Here is the value of most variables that are used below, depending
on */
/* the values of IVOICO, VOICE(1), and VOICE(2). VOICE(1) and VOICE(2
) */
/* previous call (see notes for the IF (NOUT .NE. 0) statement near th
e */
/* end). Each of these three values is either 0 or 1. These three */
-/* values below are given as 3-bit long strings, in the order IVOICO,
+/* values below are given as 3-bit long strings, in the order IVOICO,
*/
/* VOICE(1), and VOICE(2). It appears that the code above assumes tha
t */
-/* the bit sequences 010 and 101 never occur, but I wonder whether a
+/* the bit sequences 010 and 101 never occur, but I wonder whether a
*/
/* large enough number of bit errors in the channel could cause such a
*/
4, */
/* and the 45 for NL-JSAMP is actually LFRAME-3*LFRAME/4. */
-/* Note that LSAMP-JSAMP is given as the variable. This was just for
+/* Note that LSAMP-JSAMP is given as the variable. This was just for
*/
/* brevity, to avoid adding "+JSAMP" to all of the column entries. */
/* Similarly for NL-JSAMP. */
/* The only possible non-0 value of SLOPE (in column 111) is */
/* (PITCH-IPITO)/FLOAT(LSAMP) */
-/* Column 101 is identical to 100. Any good properties we can prove
+/* Column 101 is identical to 100. Any good properties we can prove
*/
/* for 100 will also hold for 101. Similarly for 010 and 011. */
-/* SYNTHS calls this subroutine with PITCH restricted to the range 20
+/* SYNTHS calls this subroutine with PITCH restricted to the range 20
to */
-/* 156. IPITO is similarly restricted to this range, after the first
+/* 156. IPITO is similarly restricted to this range, after the first
*/
/* call. IP below is also restricted to this range, given the */
/* definitions of IPITO, SLOPE, UVPIT, and that I is in the range ISTA
/* (I - MAXPIT) .LE. JUSED .LE. (I-1) */
-/* Note that the final value of I is LSAMP+1, so that
+/* Note that the final value of I is LSAMP+1, so that
after */
/* the DO loop is complete, we know: */
/* The following check is no longer nece
ssary, now that */
-/* we can prove that NOUT will never go
+/* we can prove that NOUT will never go
over 16. */
-/* IF (NOUT .GT. 16) STOP 'PITSYN: too many epochs'
+/* IF (NOUT .GT. 16) STOP 'PITSYN: too many epochs'
*/
ipiti[*nout] = ip;
goto L100;
}
-/* I want to prove what range UVPIT must lie in after
+/* I want to prove what range UVPIT must lie in after
the */
/* assignments to it below. To do this, I must determ
ine */
/* ISTART is one more than this. */
-/* Let newLSAMP be the value assigned to LSAMP below.
+/* Let newLSAMP be the value assigned to LSAMP below.
This */
/* is 180+JSAMP. Thus (newLSAMP-oldLSAMP) is either 4
5 or */
L100:
*jsamp = lsamp - jused;
}
-/* Given that the maximum pitch period MAXPIT .LT. LFRAME (this is
+/* Given that the maximum pitch period MAXPIT .LT. LFRAME (this is
*/
/* currently true on every call, since SYNTHS always sets */
/* LFRAME=180), NOUT will always be .GE. 1 at this point. */
/* This subroutine has no local state. */
/* Subroutine */ int placea_(integer *ipitch, integer *voibuf, integer *
- obound, integer *af, integer *vwin, integer *awin, integer *ewin,
+ obound, integer *af, integer *vwin, integer *awin, integer *ewin,
integer *lframe, integer *maxwin)
{
/* System generated locals */
/* Case 1: Sustained Voiced Speech */
/* If the five most recent voicing decisions are */
/* voiced, then the window is placed phase-synchronously with the */
-/* previous window, as close to the present voicing window if possible.
+/* previous window, as close to the present voicing window if possible.
*/
/* If onsets bound the voicing window, then preference is given to */
/* a phase-synchronous placement which does not overlap these onsets. */
/* Case 2: Voiced Transition */
-/* If at least one voicing decision in AF is voicied, and there are no
+/* If at least one voicing decision in AF is voicied, and there are no
*/
/* onsets, then the window is placed as in case 1. */
awin[(*af << 1) + 1] -= *ipitch;
awin[(*af << 1) + 2] -= *ipitch;
}
-/* Similarly if the placement puts the analysis window below LRANGE.
+/* Similarly if the placement puts the analysis window below LRANGE.
*/
while(awin[(*af << 1) + 1] < lrange) {
awin[(*af << 1) + 1] += *ipitch;
}
return 0;
} /* placea_ */
-
/* This subroutine has no local state. */
-/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
- integer *obound, integer *vwin, integer *af, integer *lframe, integer
+/* Subroutine */ int placev_(integer *osbuf, integer *osptr, integer *oslen,
+ integer *obound, integer *vwin, integer *af, integer *lframe, integer
*minwin, integer *maxwin, integer *dvwinl, integer *dvwinh)
{
/* System generated locals */
/* given in the LPC-10e phase 1 report. */
/* 1. If there are no onsets in this range, then the voicing window */
-/* is centered in the pitch window. If such a placement is not within
+/* is centered in the pitch window. If such a placement is not within
*/
-/* the window's placement range, then the window is placed in the left-
+/* the window's placement range, then the window is placed in the left-
*/
/* most portion of the placement range. Its length is always MAXWIN. */
/* 2. If the first onset is in 2F and there is sufficient room to place
*/
-/* the window immediately before this onset, then the window is placed
+/* the window immediately before this onset, then the window is placed
*/
/* there, and its length is set to the maximum possible under these */
/* constraints. */
/* Note that the values of MINWIN and LFRAME must be chosen such */
/* that case 2 = false implies case 3 = true. This means that */
/* MINWIN <= LFRAME/2. If this were not the case, then a fourth case */
-/* would have to be added for when the window cannot fit either before
+/* would have to be added for when the window cannot fit either before
*/
/* or after the onset. */
*/
/* time, due to the filter delays in computing onsets. The result is tha
t*/
-/* occasionally a voicing window will overlap that onset. The only way
+/* occasionally a voicing window will overlap that onset. The only way
*/
-/* to circumvent this problem is to add more delay in processing input
+/* to circumvent this problem is to add more delay in processing input
*/
-/* speech. In the trade-off between delay and window-placement, window
+/* speech. In the trade-off between delay and window-placement, window
*/
/* placement lost. */
/* Compute the placement range */
}
return 0;
} /* placev_ */
-
/* Could it be more efficient to apply multiple filters */
/* simultaneously, by combining them into one equivalent filter? */
-/* Are there ever cases when "factoring" one high-order filter into
+/* Are there ever cases when "factoring" one high-order filter into
*/
/* multiple smaller-order filter actually reduces the number of */
/* arithmetic operations needed to perform them? */
/* When I first read this subroutine, I didn't understand why the */
-/* variable temp was used. It seemed that the statements in the do
+/* variable temp was used. It seemed that the statements in the do
*/
/* loop could be replaced with the following: */
}
return 0;
} /* preemp_ */
-
}
return ret_val;
} /* random_ */
-
}
}
return 0;
-/* Note: In version embedded in other software, all calls to ERROR
+/* Note: In version embedded in other software, all calls to ERROR
*/
/* should probably be removed. */
L10:
}
return 0;
} /* rcchk_ */
-
integer ipiti[16];
real g2pass;
real pc[10];
- extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real
- *, real *, integer *, integer *, integer *, real *, real *,
+ extern /* Subroutine */ int pitsyn_(integer *, integer *, integer *, real
+ *, real *, integer *, integer *, integer *, real *, real *,
integer *, real *, struct lpc10_decoder_state *);
real rci[160] /* was [10][16] */;
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* Parameters/constants */
/* Local variables that need not be saved */
/* Local state */
-/* BUF is a buffer of speech samples that would have been returned
+/* BUF is a buffer of speech samples that would have been returned
*/
/* by the older version of SYNTHS, but the newer version doesn't, */
/* so that the newer version can always return MAXFRM samples on */
/* every call. This has the effect of delaying the return of */
/* samples for one additional frame time. */
-/* Indices 1 through BUFLEN contain samples that are left over from
+/* Indices 1 through BUFLEN contain samples that are left over from
*/
/* the last call to SYNTHS. Given the way that PITSYN works, */
/* BUFLEN should always be in the range MAXFRM-MAXPIT+1 through */
/* MAXFRM, inclusive, after a call to SYNTHS is complete. */
/* On the first call to SYNTHS (or the first call after */
-/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and
+/* reinitializing with the entry INITSYNTHS), BUFLEN is MAXFRM, and
*/
/* a frame of silence is always returned. */
/* Parameter adjustments */
r__1 = min(r__2,.99f);
rc[i__] = max(r__1,-.99f);
}
- pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe,
+ pitsyn_(&contrl_1.order, &voice[1], pitch, rms, &rc[1], &contrl_1.lframe,
ivuv, ipiti, rmsi, rci, &nout, &ratio, st);
if (nout > 0) {
i__1 = nout;
*buflen += ipiti[j - 1];
}
-/* Copy first MAXFRM samples from BUF to output array SPEECH
+/* Copy first MAXFRM samples from BUF to output array SPEECH
*/
/* (scaling them), and then remove them from the beginning of
*/
/* This subroutine has no local state. */
-/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau,
+/* Subroutine */ int tbdm_(real *speech, integer *lpita, integer *tau,
integer *ltau, real *amdf, integer *minptr, integer *maxptr, integer *
mintau)
{
/* Local variables */
real amdf2[6];
integer minp2, ltau2, maxp2, i__;
- extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer
+ extern /* Subroutine */ int difmag_(real *, integer *, integer *, integer
*, integer *, real *, integer *, integer *);
integer minamd, ptr, tau2[6];
--tau;
/* Function Body */
- difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr,
+ difmag_(&speech[1], lpita, &tau[1], ltau, &tau[*ltau], &amdf[1], minptr,
maxptr);
*mintau = tau[*minptr];
minamd = (integer)amdf[*minptr];
}
return 0;
} /* tbdm_ */
-
/* INITVOICIN. */
/* Subroutine */ int voicin_(integer *vwin, real *inbuf, real *
- lpbuf, integer *buflim, integer *half, real *minamd, real *maxamd,
- integer *mintau, real *ivrc, integer *obound, integer *voibuf,
+ lpbuf, integer *buflim, integer *half, real *minamd, real *maxamd,
+ integer *mintau, real *ivrc, integer *obound, integer *voibuf,
integer *af, struct lpc10_encoder_state *st)
{
/* Initialized data */
real *maxmin;
integer vstate;
real rc1;
- extern /* Subroutine */ int vparms_(integer *, real *, real *, integer *,
- integer *, real *, integer *, integer *, integer *, integer *,
+ extern /* Subroutine */ int vparms_(integer *, real *, real *, integer *,
+ integer *, real *, integer *, integer *, integer *, integer *,
real *, real *, real *, real *);
integer fbe, lbe;
real *snr;
/* Error correction */
/* Subroutine SETUP is the only place where order is assigned a value, */
/* and that value is 10. It could increase efficiency 1% or so to */
-/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
+/* declare order as a constant (i.e., a Fortran PARAMETER) instead of as
*/
/* a variable in a COMMON block, since it is used in many places in the */
-/* core of the coding and decoding routines. Actually, I take that back.
+/* core of the coding and decoding routines. Actually, I take that back.
*/
/* At least when compiling with f2c, the upper bound of DO loops is */
-/* stored in a local variable before the DO loop begins, and then that is
+/* stored in a local variable before the DO loop begins, and then that is
*/
/* compared against on each iteration. */
/* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
/* nbits is similar to quant, and is given a value of 54 in SETUP. */
/* corrp is given a value of .TRUE. in SETUP, and is only used in the */
/* subroutines ENCODE and DECODE. It doesn't affect the speed of the */
-/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
+/* coder significantly whether it is .TRUE. or .FALSE., or whether it is
*/
/* a constant or a variable, since it is only examined once per frame. */
/* Leaving it as a variable that is set to .TRUE. seems like a good */
/* idea, since it does enable some error-correction capability for */
-/* unvoiced frames, with no change in the coding rate, and no noticeable
+/* unvoiced frames, with no change in the coding rate, and no noticeable
*/
/* quality difference in the decoded speech. */
/* integer quant, nbits */
-/* *** Read/write: variables for debugging, not needed for LPC algorithm
+/* *** Read/write: variables for debugging, not needed for LPC algorithm
*/
-/* Current frame, Unstable frames, Output clip count, Max onset buffer,
+/* Current frame, Unstable frames, Output clip count, Max onset buffer,
*/
/* Debug listing detail level, Line count on listing page */
/* nframe is not needed for an embedded LPC10 at all. */
/* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
/* ERROR, which is only called from RCCHK. When LPC10 is embedded into */
-/* an application, I would recommend removing the call to ERROR in RCCHK,
+/* an application, I would recommend removing the call to ERROR in RCCHK,
*/
/* and remove ERROR and nunsfm completely. */
-/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
+/* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in
*/
/* sread.f. When LPC10 is embedded into an application, one might want */
/* to cause it to be incremented in a routine that takes the output of */
/* SYNTHS and sends it to an audio device. It could be optionally */
/* displayed, for those that might want to know what it is. */
-/* maxosp is never initialized to 0 in SETUP, although it probably should
+/* maxosp is never initialized to 0 in SETUP, although it probably should
*/
/* be, and it is updated in subroutine ANALYS. I doubt that its value */
/* would be of much interest to an application in which LPC10 is */
/* common /contrl/ quant, nbits */
/* common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
/* Parameters/constants */
-/* Voicing coefficient and Linear Discriminant Analysis variables:
+/* Voicing coefficient and Linear Discriminant Analysis variables:
*/
/* Max number of VDC's and VDC levels */
/* The following are not Fortran PARAMETER's, but they are */
/* Note: */
/* VALUE(1) through VALUE(8) are assigned values, but VALUE(9) */
-/* never is. Yet VALUE(9) is read in the loop that begins "DO I =
+/* never is. Yet VALUE(9) is read in the loop that begins "DO I =
*/
-/* 1, 9" below. I believe that this doesn't cause any problems in
+/* 1, 9" below. I believe that this doesn't cause any problems in
*/
-/* this subroutine, because all VDC(9,*) array elements are 0, and
+/* this subroutine, because all VDC(9,*) array elements are 0, and
*/
-/* this is what is multiplied by VALUE(9) in all cases. Still, it
+/* this is what is multiplied by VALUE(9) in all cases. Still, it
*/
-/* would save a multiplication to change the loop to "DO I = 1, 8".
+/* would save a multiplication to change the loop to "DO I = 1, 8".
*/
/* Local state */
/* WARNING! */
/* For VOICE, note that it is "shifted" in the statement that */
/* begins "IF (HALF .EQ. 1) THEN" below. Also, uninitialized */
-/* values in the VOICE array can only affect entries in the VOIBUF
+/* values in the VOICE array can only affect entries in the VOIBUF
*/
-/* array that are for the same frame, or for an older frame. Thus
+/* array that are for the same frame, or for an older frame. Thus
*/
/* the effects of uninitialized values in VOICE cannot linger on */
/* for more than 2 or 3 frame times. */
/* For SFBUE and SLBUE, the effects of uninitialized values can */
/* linger on for many frame times, because their previous values */
-/* are exponentially decayed. Thus it is more important to choose
+/* are exponentially decayed. Thus it is more important to choose
*/
/* initial values for these variables. I would guess that a */
/* reasonable initial value for SFBUE is REF/16, the same as used */
/* LBVE, LBUE, FBVE, FBUE, OFBUE, OLBUE */
/* MAXMIN is initialized on the first call, assuming that HALF */
-/* .EQ. 1 on first call. This is how ANALYS calls this subroutine.
+/* .EQ. 1 on first call. This is how ANALYS calls this subroutine.
*/
/* Voicing Decision Parameter vector (* denotes zero coefficient): */
/* The VOICE array contains the result of the linear discriminant functio
n*/
-/* (analog values). The VOIBUF array contains the hard-limited binary
+/* (analog values). The VOIBUF array contains the hard-limited binary
*/
/* voicing decisions. The VOICE and VOIBUF arrays, according to FORTRAN
*/
*maxmin = *maxamd / max(*minamd,1.f);
}
/* Calculate voicing parameters twice per frame: */
- vparms_(&vwin[1], &inbuf[inbuf_offset], &lpbuf[lpbuf_offset], &buflim[1],
+ vparms_(&vwin[1], &inbuf[inbuf_offset], &lpbuf[lpbuf_offset], &buflim[1],
half, dither, mintau, &zc, &lbe, &fbe, &qs, &rc1, &ar_b__, &
ar_f__);
-/* Estimate signal-to-noise ratio to select the appropriate VDC vector.
+/* Estimate signal-to-noise ratio to select the appropriate VDC vector.
*/
/* The SNR is estimated as the running average of the ratio of the */
/* running average full-band voiced energy to the running average */
voibuf[*half + 6] = 0;
}
/* Skip voicing decision smoothing in first half-frame: */
-/* Give a value to VSTATE, so that trace statements below will print
+/* Give a value to VSTATE, so that trace statements below will print
*/
/* a consistent value from one call to the next when HALF .EQ. 1. */
-/* The value of VSTATE is not used for any other purpose when this is
+/* The value of VSTATE is not used for any other purpose when this is
*/
/* true. */
vstate = -1;
.*/
/* Voicing override of transitions at onsets: */
-/* If a V/UV or UV/V voicing decision transition occurs within one-half
+/* If a V/UV or UV/V voicing decision transition occurs within one-half
*/
/* frame of an onset bounding a voicing window, then the transition is */
/* moved to occur at the onset. */
/* This subroutine has no local state. */
-/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer
- *buflim, integer *half, real *dither, integer *mintau, integer *zc,
+/* Subroutine */ int vparms_(integer *vwin, real *inbuf, real *lpbuf, integer
+ *buflim, integer *half, real *dither, integer *mintau, integer *zc,
integer *lbe, integer *fbe, real *qs, real *rc1, real *ar_b__, real *
ar_f__)
{
*fbe = min(i__1,32767);
return 0;
} /* vparms_ */
-
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
+
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
-
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)
/* 2 on TI C5x DSP */
-#define BYTES_PER_CHAR 2
+#define BYTES_PER_CHAR 2
#define BITS_PER_CHAR 16
#define LOG2_BITS_PER_CHAR 4
-#else
+#else
#define BYTES_PER_CHAR 1
#define BITS_PER_CHAR 8
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
+
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
-
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
/* Copyright (C) 2007-2008 Jean-Marc Valin
Copyright (C) 2008 Thorvald Natvig
-
+
File: resample.c
Arbitrary resampling code
- Low memory requirement
- Good *perceptual* quality (and not best SNR)
- Warning: This resampler is relatively new. Although I think I got rid of
+ Warning: This resampler is relatively new. Although I think I got rid of
all the major bugs and I don't expect the API to change anymore, there
may be something I've missed. So use with caution.
This algorithm is based on this original resampling algorithm:
Smith, Julius O. Digital Audio Resampling Home Page
- Center for Computer Research in Music and Acoustics (CCRMA),
+ Center for Computer Research in Music and Acoustics (CCRMA),
Stanford University, 2007.
Web published at http://www-ccrma.stanford.edu/~jos/resample/.
- There is one main difference, though. This resampler uses cubic
+ There is one main difference, though. This resampler uses cubic
interpolation instead of linear interpolation in the above paper. This
makes the table much smaller and makes it possible to compute that table
- on a per-stream basis. In turn, being able to tweak the table for each
- stream makes it possible to both reduce complexity on simple ratios
- (e.g. 2/3), and get rid of the rounding operations in the inner loop.
+ on a per-stream basis. In turn, being able to tweak the table for each
+ stream makes it possible to both reduce complexity on simple ratios
+ (e.g. 2/3), and get rid of the rounding operations in the inner loop.
The latter both reduces CPU time and makes the algorithm more SIMD-friendly.
*/
spx_uint32_t out_rate;
spx_uint32_t num_rate;
spx_uint32_t den_rate;
-
+
int quality;
spx_uint32_t nb_channels;
spx_uint32_t filt_len;
spx_uint32_t oversample;
int initialised;
int started;
-
+
/* These are per-channel */
spx_int32_t *last_sample;
spx_uint32_t *samp_frac_num;
spx_uint32_t *magic_samples;
-
+
spx_word16_t *mem;
spx_word16_t *sinc_table;
spx_uint32_t sinc_table_length;
resampler_basic_func resampler_ptr;
-
+
int in_stride;
int out_stride;
} ;
0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758,
0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490,
0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000};
-
+
static double kaiser6_table[36] = {
0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003,
0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565,
double *table;
int oversample;
};
-
+
static struct FuncDef _KAISER12 = {kaiser12_table, 64};
#define KAISER12 (&_KAISER12)
/*static struct FuncDef _KAISER12 = {kaiser12_table, 32};
/* This table maps conversion quality to internal parameters. There are two
- reasons that explain why the up-sampling bandwidth is larger than the
+ reasons that explain why the up-sampling bandwidth is larger than the
down-sampling bandwidth:
1) When up-sampling, we can assume that the spectrum is already attenuated
close to the Nyquist rate (from an A/D or a previous resampling filter)
{
float y, frac;
double interp[4];
- int ind;
+ int ind;
y = x*func->oversample;
ind = (int)floor(y);
frac = (y-ind);
interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac);
/* Just to make sure we don't have rounding problems */
interp[1] = 1.f-interp[3]-interp[2]-interp[0];
-
+
/*sum = frac*accum[1] + (1-frac)*accum[2];*/
return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3];
}
cubic_coef(frac, interp);
sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
#endif
-
+
out[out_stride * out_sample++] = PSHR32(sum,15);
last_sample += int_advance;
samp_frac_num += frac_advance;
cubic_coef(frac, interp);
sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
#endif
-
+
out[out_stride * out_sample++] = PSHR32(sum,15);
last_sample += int_advance;
samp_frac_num += frac_advance;
static void update_filter(SpeexResamplerState *st)
{
spx_uint32_t old_length;
-
+
old_length = st->filt_len;
st->oversample = quality_map[st->quality].oversample;
st->filt_len = quality_map[st->quality].base_length;
-
+
if (st->num_rate > st->den_rate)
{
/* down-sampling */
/* up-sampling */
st->cutoff = quality_map[st->quality].upsample_bandwidth;
}
-
+
/* Choose the resampling type that requires the least amount of memory */
if (st->den_rate <= st->oversample)
{
st->int_advance = st->num_rate/st->den_rate;
st->frac_advance = st->num_rate%st->den_rate;
-
+
/* Here's the place where we update the filter memory to take into account
the change in filter length. It's probably the messiest part of the code
due to handling of lots of corner cases. */
/*if (st->magic_samples[i])*/
{
/* Try and remove the magic samples as if nothing had happened */
-
+
/* FIXME: This is wrong but for now we need it to avoid going over the array bounds */
olen = old_length + 2*st->magic_samples[i];
for (j=old_length-2+st->magic_samples[i];j>=0;j--)
st->filt_len = 0;
st->mem = 0;
st->resampler_ptr = 0;
-
+
st->cutoff = 1.f;
st->nb_channels = nb_channels;
st->in_stride = 1;
st->out_stride = 1;
-
+
#ifdef FIXED_POINT
st->buffer_size = 160;
#else
st->buffer_size = 160;
#endif
-
+
/* Per channel data */
st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(int));
st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int));
speex_resampler_set_quality(st, quality);
speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate);
-
+
update_filter(st);
-
+
st->initialised = 1;
if (err)
*err = RESAMPLER_ERR_SUCCESS;
int out_sample = 0;
spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
spx_uint32_t ilen;
-
+
st->started = 1;
-
+
/* Call the right resampler through the function ptr */
out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len);
-
+
if (st->last_sample[channel_index] < (spx_int32_t)*in_len)
*in_len = st->last_sample[channel_index];
*out_len = out_sample;
st->last_sample[channel_index] -= *in_len;
-
+
ilen = *in_len;
for(j=0;j<N-1;++j)
spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
const int N = st->filt_len;
-
+
speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len);
st->magic_samples[channel_index] -= tmp_in_len;
-
+
/* If we couldn't process all "magic" input samples, save the rest for next time */
if (st->magic_samples[channel_index])
{
const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
const int istride = st->in_stride;
- if (st->magic_samples[channel_index])
+ if (st->magic_samples[channel_index])
olen -= speex_resampler_magic(st, channel_index, &out, olen);
if (! st->magic_samples[channel_index]) {
while (ilen && olen) {
spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
spx_uint32_t ochunk = olen;
-
+
if (in) {
for(j=0;j<ichunk;++j)
x[j+filt_offs]=in[j*istride];
#endif
st->out_stride = 1;
-
+
while (ilen && olen) {
spx_word16_t *y = ystack;
spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
#else
out[j*ostride_save] = WORD2INT(ystack[j]);
#endif
-
+
ilen -= ichunk;
olen -= ochunk;
out += (ochunk+omagic) * ostride_save;
st->out_stride = ostride_save;
return RESAMPLER_ERR_SUCCESS;
}
-
+
int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
{
spx_uint32_t i;
spx_uint32_t i;
if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den)
return RESAMPLER_ERR_SUCCESS;
-
+
old_den = st->den_rate;
st->in_rate = in_rate;
st->out_rate = out_rate;
st->den_rate /= fact;
}
}
-
+
if (old_den > 0)
{
for (i=0;i<st->nb_channels;i++)
st->samp_frac_num[i] = st->den_rate-1;
}
}
-
+
if (st->initialised)
update_filter(st);
return RESAMPLER_ERR_SUCCESS;
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
+
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
-
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
/* Copyright (C) 2007 Jean-Marc Valin
-
+
File: speex_resampler.h
Resampling code
-
+
The design goals of this code are:
- Very fast algorithm
- Low memory requirement
/********* WARNING: MENTAL SANITY ENDS HERE *************/
-/* If the resampler is defined outside of Speex, we change the symbol names so that
+/* If the resampler is defined outside of Speex, we change the symbol names so that
there won't be any clash if linking with Speex later on. */
#define RANDOM_PREFIX ast
#define CAT_PREFIX2(a,b) a ## b
#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b)
-
+
#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init)
#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac)
#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy)
#define spx_int32_t int
#define spx_uint16_t unsigned short
#define spx_uint32_t unsigned int
-
+
#else /* OUTSIDE_SPEEX */
#include "speex/speex_types.h"
RESAMPLER_ERR_BAD_STATE = 2,
RESAMPLER_ERR_INVALID_ARG = 3,
RESAMPLER_ERR_PTR_OVERLAP = 4,
-
+
RESAMPLER_ERR_MAX_ERROR
};
* \return Newly created resampler state
* \retval NULL Error: not enough memory
*/
-SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,
- spx_uint32_t in_rate,
- spx_uint32_t out_rate,
+SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate,
int quality,
int *err);
-/** Create a new resampler with fractional input/output rates. The sampling
- * rate ratio is an arbitrary rational number with both the numerator and
+/** Create a new resampler with fractional input/output rates. The sampling
+ * rate ratio is an arbitrary rational number with both the numerator and
* denominator being 32-bit integers.
* @param nb_channels Number of channels to be processed
* @param ratio_num Numerator of the sampling rate ratio
* @return Newly created resampler state
* @retval NULL Error: not enough memory
*/
-SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels,
- spx_uint32_t ratio_num,
- spx_uint32_t ratio_den,
- spx_uint32_t in_rate,
- spx_uint32_t out_rate,
+SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels,
+ spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den,
+ spx_uint32_t in_rate,
+ spx_uint32_t out_rate,
int quality,
int *err);
/** Resample a float array. The input and output buffers must *not* overlap.
* @param st Resampler state
- * @param channel_index Index of the channel to process for the multi-channel
+ * @param channel_index Index of the channel to process for the multi-channel
* base (0 otherwise)
* @param in Input buffer
- * @param in_len Number of input samples in the input buffer. Returns the
+ * @param in_len Number of input samples in the input buffer. Returns the
* number of samples processed
* @param out Output buffer
* @param out_len Size of the output buffer. Returns the number of samples written
*/
-int speex_resampler_process_float(SpeexResamplerState *st,
- spx_uint32_t channel_index,
- const float *in,
- spx_uint32_t *in_len,
- float *out,
+int speex_resampler_process_float(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
spx_uint32_t *out_len);
/** Resample an int array. The input and output buffers must *not* overlap.
* @param st Resampler state
- * @param channel_index Index of the channel to process for the multi-channel
+ * @param channel_index Index of the channel to process for the multi-channel
* base (0 otherwise)
* @param in Input buffer
* @param in_len Number of input samples in the input buffer. Returns the number
* @param out Output buffer
* @param out_len Size of the output buffer. Returns the number of samples written
*/
-int speex_resampler_process_int(SpeexResamplerState *st,
- spx_uint32_t channel_index,
- const spx_int16_t *in,
- spx_uint32_t *in_len,
- spx_int16_t *out,
+int speex_resampler_process_int(SpeexResamplerState *st,
+ spx_uint32_t channel_index,
+ const spx_int16_t *in,
+ spx_uint32_t *in_len,
+ spx_int16_t *out,
spx_uint32_t *out_len);
/** Resample an interleaved float array. The input and output buffers must *not* overlap.
* @param out_len Size of the output buffer. Returns the number of samples written.
* This is all per-channel.
*/
-int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
- const float *in,
- spx_uint32_t *in_len,
- float *out,
+int speex_resampler_process_interleaved_float(SpeexResamplerState *st,
+ const float *in,
+ spx_uint32_t *in_len,
+ float *out,
spx_uint32_t *out_len);
/** Resample an interleaved int array. The input and output buffers must *not* overlap.
* @param out_len Size of the output buffer. Returns the number of samples written.
* This is all per-channel.
*/
-int speex_resampler_process_interleaved_int(SpeexResamplerState *st,
- const spx_int16_t *in,
- spx_uint32_t *in_len,
- spx_int16_t *out,
+int speex_resampler_process_interleaved_int(SpeexResamplerState *st,
+ const spx_int16_t *in,
+ spx_uint32_t *in_len,
+ spx_int16_t *out,
spx_uint32_t *out_len);
/** Set (change) the input/output sampling rates (integer value).
* @param in_rate Input sampling rate (integer number of Hz).
* @param out_rate Output sampling rate (integer number of Hz).
*/
-int speex_resampler_set_rate(SpeexResamplerState *st,
- spx_uint32_t in_rate,
+int speex_resampler_set_rate(SpeexResamplerState *st,
+ spx_uint32_t in_rate,
spx_uint32_t out_rate);
/** Get the current input/output sampling rates (integer value).
* @param in_rate Input sampling rate (integer number of Hz) copied.
* @param out_rate Output sampling rate (integer number of Hz) copied.
*/
-void speex_resampler_get_rate(SpeexResamplerState *st,
- spx_uint32_t *in_rate,
+void speex_resampler_get_rate(SpeexResamplerState *st,
+ spx_uint32_t *in_rate,
spx_uint32_t *out_rate);
-/** Set (change) the input/output sampling rates and resampling ratio
+/** Set (change) the input/output sampling rates and resampling ratio
* (fractional values in Hz supported).
* @param st Resampler state
* @param ratio_num Numerator of the sampling rate ratio
* @param in_rate Input sampling rate rounded to the nearest integer (in Hz).
* @param out_rate Output sampling rate rounded to the nearest integer (in Hz).
*/
-int speex_resampler_set_rate_frac(SpeexResamplerState *st,
- spx_uint32_t ratio_num,
- spx_uint32_t ratio_den,
- spx_uint32_t in_rate,
+int speex_resampler_set_rate_frac(SpeexResamplerState *st,
+ spx_uint32_t ratio_num,
+ spx_uint32_t ratio_den,
+ spx_uint32_t in_rate,
spx_uint32_t out_rate);
/** Get the current resampling ratio. This will be reduced to the least
* @param ratio_num Numerator of the sampling rate ratio copied
* @param ratio_den Denominator of the sampling rate ratio copied
*/
-void speex_resampler_get_ratio(SpeexResamplerState *st,
- spx_uint32_t *ratio_num,
+void speex_resampler_get_ratio(SpeexResamplerState *st,
+ spx_uint32_t *ratio_num,
spx_uint32_t *ratio_den);
/** Set (change) the conversion quality.
* @param st Resampler state
- * @param quality Resampling quality between 0 and 10, where 0 has poor
+ * @param quality Resampling quality between 0 and 10, where 0 has poor
* quality and 10 has very high quality.
*/
-int speex_resampler_set_quality(SpeexResamplerState *st,
+int speex_resampler_set_quality(SpeexResamplerState *st,
int quality);
/** Get the conversion quality.
* @param st Resampler state
- * @param quality Resampling quality between 0 and 10, where 0 has poor
+ * @param quality Resampling quality between 0 and 10, where 0 has poor
* quality and 10 has very high quality.
*/
-void speex_resampler_get_quality(SpeexResamplerState *st,
+void speex_resampler_get_quality(SpeexResamplerState *st,
int *quality);
/** Set (change) the input stride.
* @param st Resampler state
* @param stride Input stride
*/
-void speex_resampler_set_input_stride(SpeexResamplerState *st,
+void speex_resampler_set_input_stride(SpeexResamplerState *st,
spx_uint32_t stride);
/** Get the input stride.
* @param st Resampler state
* @param stride Input stride copied
*/
-void speex_resampler_get_input_stride(SpeexResamplerState *st,
+void speex_resampler_get_input_stride(SpeexResamplerState *st,
spx_uint32_t *stride);
/** Set (change) the output stride.
* @param st Resampler state
* @param stride Output stride
*/
-void speex_resampler_set_output_stride(SpeexResamplerState *st,
+void speex_resampler_set_output_stride(SpeexResamplerState *st,
spx_uint32_t stride);
/** Get the output stride.
* @param st Resampler state copied
* @param stride Output stride
*/
-void speex_resampler_get_output_stride(SpeexResamplerState *st,
+void speex_resampler_get_output_stride(SpeexResamplerState *st,
spx_uint32_t *stride);
/** Get the latency in input samples introduced by the resampler.
*/
int speex_resampler_get_output_latency(SpeexResamplerState *st);
-/** Make sure that the first samples to go out of the resamplers don't have
- * leading zeros. This is only useful before starting to use a newly created
+/** Make sure that the first samples to go out of the resamplers don't have
+ * leading zeros. This is only useful before starting to use a newly created
* resampler. It is recommended to use that when resampling an audio file, as
* it will generate a file with the same length. For real-time processing,
* it is probably easier not to use this call (so that the output duration
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
+
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
-
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
#endif
#if defined(VAR_ARRAYS)
-#define VARDECL(var)
+#define VARDECL(var)
#define ALLOC(var, size, type) type var[size]
#elif defined(USE_ALLOCA)
#define VARDECL(var) var
; Additional country configurations can be found in the Asterisk source
; at /configs/samples/indications.conf.sample
-
[1108](aor-single-reg)
mailboxes = 1108@example
-
member => PJSIP/1101 ; Maria Berny - Director of Customer Experience
member => PJSIP/1115 ; Dusty Williams - Customer Advocate
member => PJSIP/1102 ; Tommy Briar - Customer Advocate
-
; jblog = no ; Enables jitterbuffer frame logging. Defaults to "no".
; ----------------------------------------------------------------------------------
-
; When set to plain, the password is in plaintext.
;
;password_format = plain
-
SHOWDISPLAY "callended" AT 2
ENDIF
ENDSUB
-
;rungroup = asterisk ; The group to run as.
;lightbackground = yes ; If your terminal is set for a light-colored
; background.
-;forceblackbackground = yes ; Force the background of the terminal to be
+;forceblackbackground = yes ; Force the background of the terminal to be
; black, in order for terminal colors to show
; up properly.
;defaultlanguage = en ; Default language
;setvar = CALLERID(name)=${CALENDAR_EVENT(summary)}
;[calendar2]
-; Note: Support for Exchange Server 2003
+; Note: Support for Exchange Server 2003
;
;type = exchange ; type of calendar--currently supported: ical, caldav, exchange, or ews
;url = https://example.com/exchange/jdoe ; URL to MS Exchange OWA for user (usually includes exchange/user)
; for this is to allow different sections to specify different values for
; a certain named column, presumably separated by filters.
;static "Some Special Value" => identifier_code
-
; setting hostname=localhost
;
; port and sock are both optional parameters. If hostname is specified
-; and is not "localhost" (you can use address 127.0.0.1 instead), then
-; cdr_mysql will attempt to connect to the port specified or use the
-; default port. If hostname is not specified or if hostname is
-; "localhost", then cdr_mysql will attempt to connect to the socket file
+; and is not "localhost" (you can use address 127.0.0.1 instead), then
+; cdr_mysql will attempt to connect to the port specified or use the
+; default port. If hostname is not specified or if hostname is
+; "localhost", then cdr_mysql will attempt to connect to the socket file
; specified by sock or otherwise use the default socket file.
;
;[global]
;hostname=database.host.name
;dbname=asteriskcdrdb
;table=cdr
-;password=password
+;password=password
;user=asteriskcdruser
;port=3306
;sock=/tmp/mysql.sock
;alias accountcode => <a_field_not_named_accountcode>
;alias userfield => <a_field_not_named_userfield>
;alias uniqueid => <a_field_not_named_uniqueid>
-
; Default value: false
;hrtime=false
-
;show_user_defined=yes
;
-; RADIUS CEL Backend
+; RADIUS CEL Backend
;
[radius]
;
; MFC-R2 signaling has lots of variants from country to country and even sometimes
; minor variants inside the same country. The only mandatory parameters here are:
; mfcr2_variant, mfcr2_max_ani and mfcr2_max_dnis.
-; IT IS RECOMMENDED that you leave the default values (leaving it commented) for the
-; other parameters unless you have problems or you have been instructed to change some
-; parameter. OpenR2 library uses the mfcr2_variant parameter to try to determine the
-; best defaults for your country, also refer to the OpenR2 package directory
-; doc/asterisk/ where you can find sample configurations for some countries. If you
-; want to contribute your configs for a particular country send them to the e-mail
+; IT IS RECOMMENDED that you leave the default values (leaving it commented) for the
+; other parameters unless you have problems or you have been instructed to change some
+; parameter. OpenR2 library uses the mfcr2_variant parameter to try to determine the
+; best defaults for your country, also refer to the OpenR2 package directory
+; doc/asterisk/ where you can find sample configurations for some countries. If you
+; want to contribute your configs for a particular country send them to the e-mail
; of the primary OpenR2 developer that you can find in the AUTHORS file of the OpenR2 package
; MFC/R2 variant. This depends on the OpenR2 supported variants
;
[general]
-interval=30 ; Number of seconds between trying to connect to devices.
+interval=30 ; Number of seconds between trying to connect to devices.
; The following is a list of adapters we use.
; id must be unique and address is the bdaddr of the adapter from hciconfig.
address=00:80:C8:35:52:78
; The following is a list of the devices we deal with.
-; Every device listed below will be available for calls in and out of Asterisk.
+; Every device listed below will be available for calls in and out of Asterisk.
; Each device needs an adapter=xxxx entry which determines which bluetooth adapter is used.
; Use the CLI command 'mobile search' to discover devices.
; Use the CLI command 'mobile show devices' to see device status.
;max_bandwidth=wide ; Maximum encoded bandwidth set to wide band (0-8000 Hz
; ; audio bandwidth at 16Khz sample rate)
;cbr=yes ; Force a constant bit rate (i.e don't use what's on the SDP)
-
# For most databases, this is fine. Set to 'no' for Sybase or MS SQL Server.
backslash_is_escape=yes
-
;successive number hits/misses of 12.75ms before a digit/nodigit is considered valid
;dtmf_hits_to_begin=2
;dtmf_misses_to_end=3
-
; note that using dynamic realtime extensions is not recommended anymore as a
; best practice; instead, you should consider writing a static dialplan with
; proper data abstraction via a tool like func_odbc.
-
["1234"] = "SIP/1234";
};
}
-
exten => sendvmcleanup,n,hangup
exten => h,1,gotoif($[${MINIVM_RECORD_STATUS} = SUCCESS]?sendvmcleanup,1))
-
;festivalcommand=(tts_textasterisk "%s" 'file)(quit)\n
;
;
-
sorry_prompt=>followme/sorry
; The 'I'm sorry, but we were unable to locate your party' message prompt. Default
; is the global default.
-
-
dsn=mysql1
readsql=SELECT location FROM presence WHERE id='${SQL_ESC(${ARG1})}'
writesql=UPDATE presence SET location='${SQL_ESC(${VAL1})}' WHERE id='${SQL_ESC(${ARG1})}'
-
; USE A '*' PROVISIONING ENTRY UNLESS YOU KNOW WHAT YOU'RE DOING.
;
;template=default
-
;permit=209.16.236.73/255.255.255.0
;acl=named_acl_example ; use a named ACL from acl.conf
;
-;
+;
;setvar=PBXACCOUNT=edvina
; The setvar option defines channel variables that will be set when this account
; originates a call. You can define multiple setvar= commands for one manager
;
;read = system,call,log,verbose,agent,user,config,dtmf,reporting,cdr,dialplan
;write = system,call,agent,user,config,command,reporting,originate,message
-
; --------------------- DIGIT TIMEOUTS ----------------------------
firstdigittimeout = 30000 ; default 16000 = 16s
-gendigittimeout = 10000 ; default 8000 = 8s
+gendigittimeout = 10000 ; default 8000 = 8s
matchdigittimeout = 5000 ; defaults 3000 = 3s
; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
;; The MGCP channel supports the following service codes:
;; # - Transfer
-;; *67 - Calling Number Delivery Blocking
-;; *70 - Cancel Call Waiting
-;; *72 - Call Forwarding Activation
-;; *73 - Call Forwarding Deactivation
-;; *78 - Do Not Disturb Activation
-;; *79 - Do Not Disturb Deactivation
+;; *67 - Calling Number Delivery Blocking
+;; *70 - Cancel Call Waiting
+;; *72 - Call Forwarding Activation
+;; *73 - Call Forwarding Deactivation
+;; *78 - Do Not Disturb Activation
+;; *79 - Do Not Disturb Deactivation
;; *8 - Call pick-up
;
-; known to work with Swissvoice IP10s
-;[192.168.1.20]
-;context=local
-;host=192.168.1.20
-;callerid = "John Doe" <123>
+; known to work with Swissvoice IP10s
+;[192.168.1.20]
+;context=local
+;host=192.168.1.20
+;callerid = "John Doe" <123>
;callgroup=0 ; in the range from 0 to 63
;pickupgroup=0 ; in the range from 0 to 63
-;nat=no
-;threewaycalling=yes
+;nat=no
+;threewaycalling=yes
;transfer=yes ; transfer requires threewaycalling=yes. Use FLASH to transfer
;callwaiting=yes ; this might be a cause of trouble for ip10s
-;cancallforward=yes
-;line => aaln/1
+;cancallforward=yes
+;line => aaln/1
;
;[dph100]
; 'documentation', or 'omit'
;context = local
;host = 192.168.1.20
-;wcardep = aaln/* ; enables wildcard endpoint and sets it to 'aaln/*'
+;wcardep = aaln/* ; enables wildcard endpoint and sets it to 'aaln/*'
; another common format is '*'
;callerid = "Duane Cox" <123> ; now lets setup line 1 using per endpoint configuration...
;callwaiting = no
e164=12345
rtptimeout=60
dtmfmode=rfc2833
-
-
-
-
-
; to add video support, uncomment this and remember to install
; the keypad and keypad_font files to the right place
; [general](+,my_video,skin2)
-
;snom 300, 320, 360, 370, 820, 821, 870 support
snom-${MAC}.xml => snom-mac.xml
-
; penaltychange => 30,+3 ; 30 seconds into the call increase the QUEUE_MAX_PENALTY by 3, no change to QUEUE_MIN_PENALTY
; penaltychange => 60,10,5 ; 60 seconds into the call increase the QUEUE_MAX_PENALTY to 10 and increase the QUEUE_MIN_PENALTY to 5
; penaltychange => 75,,7 ; 75 seconds into the call keep the QUEUE_MAX_PENALTY the same and increase the QUEUE_MIN_PENALTY to 7
-
; fewestcalls - ring the one with fewest completed calls from this queue
; random - ring random interface
; rrmemory - round robin with memory, remember where we left off last ring pass
-; rrordered - same as rrmemory, except the queue member order from config file
+; rrordered - same as rrmemory, except the queue member order from config file
; is preserved
; linear - rings interfaces in the order specified in this configuration file.
; If you use dynamic members, the members will be rung in the order in
; If dbhost is commented out or the string "localhost", a connection
; to the local host is assumed and dbsock is used instead of TCP/IP
; to connect to the server. If no dbcharset is specified, the connection
-; is made with no extra charset configurations sent to MySQL, leaving all
+; is made with no extra charset configurations sent to MySQL, leaving all
; configured MySQL charset options and defaults untouched.
;
; Multiple database contexts may be configured, with the caveat that
; to lock for writing.
;
;batch=1000
-
-; Generic Fax Application configuration
+; Generic Fax Application configuration
[general]
; Maximum Transmission Rate
; Realtime configuration
; ----------------------
-; In order to use this module, you start
+; In order to use this module, you start
; in extconfig.conf with a configuration like this:
;
; sippeers = ldap,"dc=myDomain,dc=myDomainExt",sip
; TLS support
; -----------
; Note that you can configure an ldaps: url here to get TLS support.
-; Detailed configuration of certificates and supported CAs is done in your
+; Detailed configuration of certificates and supported CAs is done in your
; ldap.conf file for OpenLDAP clients on your system.
; This requires that you have OpenLDAP libraries compiled with TLS support
; *********************************************************************************
; NOTE: res_ldap.conf should be chmod 600 because it contains the plain-text LDAP
-; password to an account with WRITE access to the asterisk configuration.
+; password to an account with WRITE access to the asterisk configuration.
; *********************************************************************************
[_general]
regexten = AstAccountRegistrationExten
CanCallForward = AstAccountCanCallForward
additionalFilter=(objectClass=AstAccount)
-
; actual socket is constructed as a combination of dbsock and dbport. For
; example, the values of '/tmp' and '5432', respectively, will specify a socket
; file of '/tmp/.s.PGSQL.5432'.
-;
+;
;dbsock=/tmp
;
; requirements - At startup, each realtime family will make requirements
; If you use the subagent model, you need to enable agentx in snmpd.conf
; Note that you can only run one Asterisk on the system in this case.
;
-; See https://wiki.asterisk.org/wiki/display/AST/Simple+Network+Management+Protocol+(SNMP)+Support
+; See https://wiki.asterisk.org/wiki/display/AST/Simple+Network+Management+Protocol+(SNMP)+Support
; to get more information about
; snmp support in Asterisk
_[n]um:1XX => digits/hundred, num:${SAY:1}
_[n]um:[2-9]00 => num:${SAY:0:1}, digits/hundred
_[n]um:[2-9]XX => num:${SAY:0:1}, digits/hundred, num:${SAY:1}
-
+
_[n]um:1000 => digits/thousand
_[n]um:1XXX => digits/thousand, num:${SAY:1}
_[n]um:[2-9]000 => num:${SAY:0:1}, digits/thousand
_[n]um:XXXXX => num:${SAY:0:2}, digits/thousand, num:${SAY:2}
_[n]um:XXX000 => num:${SAY:0:3}, digits/thousand
_[n]um:XXXXXX => num:${SAY:0:3}, digits/thousand, num:${SAY:3}
-
+
_[n]um:1000000 => num:${SAY:0:1}, digits/million
_[n]um:1XXXXXX => num:${SAY:0:1}, digits/million, num:${SAY:1}
_[n]um:[2-9]000000 => num:${SAY:0:1}, digits/million
_[n]um:XXXXXXXX => num:${SAY:0:2}, digits/million, num:${SAY:2}
_[n]um:XXX000000 => num:${SAY:0:3}, digits/million
_[n]um:XXXXXXXXX => num:${SAY:0:3}, digits/million, num:${SAY:3}
-
- _datetime::. => date:AdBY 'digits/at' H 'hours' M 'perc':${SAY}
+
+ _datetime::. => date:AdBY 'digits/at' H 'hours' M 'perc':${SAY}
_date::. => date:AdBY:${SAY}
_time::. => date:H 'hours' M 'perc':${SAY}
-
+
_pho[n]e:XXXX => num:${SAY:0:2}, num:${SAY:2:2}
_pho[n]e:0[1-9]XXXXXXXX => num:${SAY:0:1}, num:${SAY:1:1}, num:${SAY:2:2}, num:${SAY:4:2}, num:${SAY:6:2}, num:${SAY:8:2}
_pho[n]e:. => digit:${SAY}
; ** Old configuration options **
; The "call-limit" configuation option is considered old is replaced
-; by new functionality. To enable callcounters, you use the new
+; by new functionality. To enable callcounters, you use the new
; "callcounter" setting (for extension states in queue and subscriptions)
; You are encouraged to use the dialplan groupcount functionality
; to enforce call limits instead of using this channel-specific method.
; Set this to your host name or domain name
;domainsasrealm=no ; Use domains list as realms
; You can serve multiple Realms specifying several
- ; 'domain=...' directives (see below).
+ ; 'domain=...' directives (see below).
; In this case Realm will be based on request 'From'/'To' header
; and should match one of domain names.
; Otherwise default 'realm=...' will be used.
; makes the assumption that the endpoint supports all known SIP methods.
; If you know that your SIP endpoint does not provide support for a specific
; method, then you may provide a comma-separated list of methods that your
-; endpoint does not implement in the disallowed_methods option. Note that
-; if your endpoint is truthful with its Allow header, then there is no need
+; endpoint does not implement in the disallowed_methods option. Note that
+; if your endpoint is truthful with its Allow header, then there is no need
; to set this option. This option may be set in the general section or may
; be set per endpoint. If this option is set both in the general section and
; in a peer section, then the peer setting completely overrides the general
; Optionally add a port number, 192.168.1.1:5063 (default is port 5061)
; Remember that the IP address must match the common name (hostname) in the
; certificate, so you don't want to bind a TLS socket to multiple IP addresses.
- ; For details how to construct a certificate for SIP see
+ ; For details how to construct a certificate for SIP see
; http://tools.ietf.org/html/draft-ietf-sip-domain-certs
;tcpauthtimeout = 30 ; tcpauthtimeout specifies the maximum number
; but the remote party's domain will be anonymized. The way legacy
; behaves may violate RFC-3325, but it follows historic behavior.
; This option is set to 'legacy' by default
-;prematuremedia=no ; Some ISDN links send empty media frames before
- ; the call is in ringing or progress state. The SIP
+;prematuremedia=no ; Some ISDN links send empty media frames before
+ ; the call is in ringing or progress state. The SIP
; channel will then send 183 indicating early media
; which will be empty - thus users get no ring signal.
; Setting this to "yes" will stop any media before we have
; call progress (meaning the SIP channel will not send 183 Session
; Progress for early media). Default is "yes". Also make sure that
- ; the SIP peer is configured with progressinband=never.
+ ; the SIP peer is configured with progressinband=never.
;
; In order for "noanswer" applications to work, you need to run
; the progress() application in the priority before the app.
; externaddr = 12.34.56.78 ; use this address.
; externaddr = 12.34.56.78:9900 ; use this address and port.
; externaddr = mynat.my.org:12600 ; Public address of my nat box.
-; externtcpport = 9900 ; The externally mapped tcp port, when Asterisk is behind a static NAT or PAT.
-; ; externtcpport will default to the externaddr or externhost port if either one is set.
+; externtcpport = 9900 ; The externally mapped tcp port, when Asterisk is behind a static NAT or PAT.
+; ; externtcpport will default to the externaddr or externhost port if either one is set.
; externtlsport = 12600 ; The externally mapped tls port, when Asterisk is behind a static NAT or PAT.
-; ; externtlsport port will default to the RFC designated port of 5061.
+; ; externtlsport port will default to the RFC designated port of 5061.
;
; b. "externhost = hostname[:port]" is similar to "externaddr" except
; that the hostname is looked up every "externrefresh" seconds
; It only controls Asterisk generating reINVITEs for the specific
; purpose of setting up a direct media path. If a reINVITE is
; needed to switch a media stream to inactive (when placed on
- ; hold) or to T.38, it will still be done, regardless of this
+ ; hold) or to T.38, it will still be done, regardless of this
; setting. Note that direct T.38 is not supported.
;directmedia=nonat ; An additional option is to allow media path redirection
; callers INVITE. This will also fail if directmedia is enabled when
; the device is actually behind NAT.
-;directmediadeny=0.0.0.0/0 ; Use directmediapermit and directmediadeny to restrict
+;directmediadeny=0.0.0.0/0 ; Use directmediapermit and directmediadeny to restrict
;directmediapermit=172.16.0.0/16; which peers should be able to pass directmedia to each other
; (There is no default setting, this is just an example)
; Use this if some of your phones are on IP addresses that
- ; can not reach each other directly. This way you can force
+ ; can not reach each other directly. This way you can force
; RTP to always flow through asterisk in such cases.
;directmediaacl=acl_example ; Use named ACLs defined in acl.conf
; matches rather than the IP address. Since it is also a peer, a friend entity can
; be called as long as its IP is known to Asterisk. In the case of host=dynamic,
; this means it is necessary for the entity to register before Asterisk can call it.
-;
+;
; Use remotesecret for outbound authentication, and secret for authenticating
; inbound requests. For historical reasons, if no remotesecret is supplied for an
-; outbound registration or call, the secret will be used.
+; outbound registration or call, the secret will be used.
;
; For device names, we recommend using only a-z, numerics (0-9) and underscore
;
;speeddial => 112@hints,Bob Peterson ; When a context is specified, the speeddial watches a dialplan hint.
;addon => 7914
;addon => 7914
-
; NOTE: You can not just put any type of channel here.
; DAHDI channels can be directly used. IP trunks
; require some indirect configuration which is
- ; described in
+ ; described in
; https://wiki.asterisk.org/wiki/display/AST/SLA+Trunk+Configuration
;autocontext=line1 ; This supports automatic generation of the dialplan entries
;[station5](station)
;device=SIP/station5
; --------------------------------------
-
;LINEKEYS = 1
;linenumber = 1
;cid_number = 6000
-
; overridden in the per-mailbox settings, unless listed otherwise.
;
; tz=central ; Timezone from zonemessages below. Irrelevant if envelope=no.
-; locale=de_DE.UTF-8 ; set the locale for generation of the date/time strings (make
+; locale=de_DE.UTF-8 ; set the locale for generation of the date/time strings (make
; sure the locales are installed in your operating system; e.g
; on Debian Linux you can use "dpkg-reconfigure locales").
; If you use UTF-8 locales, make sure to set the "charset" option
; Useful if Windows users want wav49, but Linux users want gsm.
; [per-mailbox only]
; saycid=yes ; Say the caller id information before the message. If not described,
- ; or set to no, it will be in the envelope. When enabled, if a recorded file
- ; with the same name as the caller id exists in
+ ; or set to no, it will be in the envelope. When enabled, if a recorded file
+ ; with the same name as the caller id exists in
; <astspooldir>/recordings/callerids, then that file will be played as a name
; rather than saying each digit as a phone number.
; cidinternalcontexts=intern ; Internal Context for Name Playback instead of
; "default" will be used.
;forceoldssl=no ; Force the use of old-style SSL.
;keepalive=
-
app_festival is an application that allows one to send text-to-speech commands
to a background festival server, and to obtain the resulting waveform which
-gets sent down to the respective channel. app_festival also employs a waveform
-cache, so invariant text-to-speech strings ("Please press 1 for instructions")
-do not need to be dynamically generated all the time.
+gets sent down to the respective channel. app_festival also employs a waveform
+cache, so invariant text-to-speech strings ("Please press 1 for instructions")
+do not need to be dynamically generated all the time.
-You need :
+You need :
1) festival, patched to produce 8khz waveforms on output. Patch for Festival
-1.4.2 RELEASE are included. The patch adds a new command to festival
-(asterisk_tts).
+1.4.2 RELEASE are included. The patch adds a new command to festival
+(asterisk_tts).
It is possible to run Festival without patches in the source-code. Just
add this to your /etc/festival.scm or /usr/share/festival/festival/scm:
original mentioning of it]
2) You may wish to obtain and install the asterisk-perl
-module by James Golovich <james@gnuinter.net>, from
+module by James Golovich <james@gnuinter.net>, from
either CPAN, or his site: http://asterisk.gnuinter.net,
as this contains a good example of how variable text
can be tts'd via asterisk, namely the examples/tts-*.agi
fixed, pre-recorded messages may be more amenable for your
purposes.
-3) Before running asterisk, you have to run festival-server with a command
-like :
+3) Before running asterisk, you have to run festival-server with a command
+like :
/usr/local/festival/bin/festival --server > /dev/null 2>&1 &
def downgrade():
op.drop_table('cdr')
-
def downgrade():
op.alter_column('sippeers', 'useragent', type_=sa.String(20))
-
sa.Enum(name=QUEUE_STRATEGY_NAME).drop(op.get_bind(), checkfirst=False)
sa.Enum(name=QUEUE_AUTOPAUSE_NAME).drop(op.get_bind(), checkfirst=False)
-
def downgrade():
op.drop_column('ps_endpoints', 'fax_detect_timeout')
-
if op.get_context().bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_contacts_authenticate_qualify_yesno_values','ps_contacts')
op.drop_column('ps_contacts', 'authenticate_qualify')
-
if op.get_context().bind.dialect.name == 'mssql':
op.drop_constraint('ck_ps_globals_ignore_uri_user_options_yesno_values','ps_globals')
op.drop_column('ps_globals', 'ignore_uri_user_options')
-
########################## drop tables ###########################
op.drop_table('queue_rules')
-
run_migrations_offline()
else:
run_migrations_online()
-
def downgrade():
op.alter_column('voicemail_messages', 'recording', type_=sa.LargeBinary)
-
and samplerate given in the parameters to the oss input
module above or the remsaple/downmix section below. -->
- <encode>
+ <encode>
<quality>0</quality>
<samplerate>8000</samplerate>
<channels>1</channels>
<downmix>0</downmix>
<!-- resampling.
-
+
Set to the frequency (in Hz) you wish to resample to, -->
-
+
<!-- <resample>
<in-rate>44100</in-rate>
<out-rate>22050</out-rate>
# - Added test for safe_asterisk
# - Changed "stop gracefully" to "stop now"
# - Added support for -U and -G command line options
-# - Modified "reload" to call asterisk -rx 'reload'
+# - Modified "reload" to call asterisk -rx 'reload'
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=asterisk
#!/bin/sh
-#
+#
# asterisk: Starts the asterisk service
-#
+#
# Version: @(#) /etc/rc.d/init.d/asterisk 1.0
-#
+#
# chkconfig: 2345 95 10
# description: Starts the asterisk service
-#
+#
# processname: asterisk
-#
+#
### BEGIN INIT INFO
# Provides: asterisk
ASTARGS="${ASTARGS} -c"
fi
fi
-if [ ! -w ${DUMPDROP} ]; then
+if [ ! -w ${DUMPDROP} ]; then
echo "Cannot write to ${DUMPDROP}" >&2
exit 1
fi
run_asterisk()
{
- while :; do
+ while :; do
if [ "$TTY" != "" ]; then
cd /tmp
esac
exit 0
-
# - Added test for safe_asterisk
# - Verified SIGTERM issued by "killproc" ensures "stop gracefully"
# - Added support for -U and -G command line options
-# - Modified "reload" to call asterisk -rx 'reload'
+# - Modified "reload" to call asterisk -rx 'reload'
### BEGIN INIT INFO
# Provides: asterisk
*)
echo "usage $0 start|stop|restart" ;;
esac
-
# - Added test for safe_asterisk
# - Verified SIGTERM issued by "killproc" ensures "stop gracefully"
# - Added support for -U and -G command line options
-# - Modified "reload" to call asterisk -rx 'reload'
+# - Modified "reload" to call asterisk -rx 'reload'
### BEGIN INIT INFO
# Provides: asterisk
messages-expire.pl
-messages-expire finds messages more than X days old and deletes them.
+messages-expire finds messages more than X days old and deletes them.
Because the older messages will be the lower numbers in the folder (msg0000
-will be older than msg0005), just deleting msg0000 will not work.
+will be older than msg0005), just deleting msg0000 will not work.
expire-messages then runs a routine that goes into every folder in every
-mailbox to reorganize. If the folder contains msg0000, no action is taken.
+mailbox to reorganize. If the folder contains msg0000, no action is taken.
If the folder does not, the rename routine takes the oldest message and
names it msg0000, the next oldest message and names it msg0001 and so on.
names.
-O Org name (cert field)
An informational string (company name)
- -o Output filename base (defaults to asterisk)
+ -o Output filename base (defaults to asterisk)
-d Output directory (defaults to the current directory)
Example:
while (defined($_ = $term->readline($prompt))) {
(logoff() and exit) if $_ =~ /exit|quit/; # Give them a way to exit the "terminal"
print send_command($_) if $_ !~ m/^\s*$/;
- }
+ }
} else {
while (<>) {
chomp;
foreach my $item (split /\s+/, $res) {
$items{$item}++ unless ($item eq '_EOF_' or $item eq '' or $item eq $lastword);
}
-
+
#print STDERR "\nword=\"$word\" buffer=\"$buffer\" offset=\"$offset\" res=\"$res\"\n";
return sort keys %items;
}
-
.ds f2\"
.ds f3\"
.ds f4\"
-'\" t
-.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n
+'\" t
+.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n
.TH ASTGENKEY 8 "May 14th, 2005" "Asterisk" "Linux Programmer's Manual"
.SH NAME
.B astgenkey \- generates keys for for Asterisk IAX2 RSA authentication
.SH SYNOPSIS
-.PP
+.PP
.B astgenkey
[ \-q ] [ \-n ] [ \fIkeyname\fP ]
.SH DESCRIPTION
-.B astgenkey
-This script generates an RSA private and public key pair in PEM format
-for use by Asterisk. The private key should be kept a secret, as it can
-be used to fake your system's identity. Thus by default (without the
-option
+.B astgenkey
+This script generates an RSA private and public key pair in PEM format
+for use by Asterisk. The private key should be kept a secret, as it can
+be used to fake your system's identity. Thus by default (without the
+option
.I \-n
-) the script will create a passphrase-encrypted copy of your secret key:
-without entering the passphrase you won't be able to use it.
+) the script will create a passphrase-encrypted copy of your secret key:
+without entering the passphrase you won't be able to use it.
-However if you want to use such a key with Asterisk, you'll have to start
+However if you want to use such a key with Asterisk, you'll have to start
it interactively, because the scripts that start asterisk can't use that
encrypted key.
-The key is identified by a name. If you don't write the name on the
+The key is identified by a name. If you don't write the name on the
command-line you'll be prompted for one. The outputs of the script are:
.I name\fB.pub
The private key: secret.
.RE
-Those files should be copied to
+Those files should be copied to
.I /var/lib/asterisk/keys
(The private key: on your system. The public key: on other systems)
.RS
.RE
-.SH "SEE ALSO"
-asterisk(8), genrsa(1), rsa(1),
+.SH "SEE ALSO"
+asterisk(8), genrsa(1), rsa(1),
http://www.voip\-info.org/wiki\-Asterisk+iax+rsa+auth
-.SH "AUTHOR"
-This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU General Public License, Version 2 any
-later version published by the Free Software Foundation.
+.SH "AUTHOR"
+This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 any
+later version published by the Free Software Foundation.
-On Debian systems, the complete text of the GNU General Public
-License can be found in /usr/share/common\-licenses/GPL\-2.
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common\-licenses/GPL\-2.
fi
-for type in alerts applications firmwares lines networks phones translations;
-do
- echo "------------------" >> $OUTPUT;
- echo "DIGIUM PHONE: $type " >> $OUTPUT;
- echo "------------------" >> $OUTPUT;
- TEMP=$(asterisk -rx "digium_phones show $type");
+for type in alerts applications firmwares lines networks phones translations;
+do
+ echo "------------------" >> $OUTPUT;
+ echo "DIGIUM PHONE: $type " >> $OUTPUT;
+ echo "------------------" >> $OUTPUT;
+ TEMP=$(asterisk -rx "digium_phones show $type");
if [ "$type" = "lines" ];
then
NUM=$(echo $TEMP | tail -n 1 | awk -F' ' '{print $(NF-4)}');
if [ $NUM -gt 0 ];
then
- for l in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //;
- s/Lines \(Un-\)\?Mapped to Phones --- //g;
- s/ Internal//g;
+ for l in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //;
+ s/Lines \(Un-\)\?Mapped to Phones --- //g;
+ s/ Internal//g;
s/---- [a-zA-Z0-9 ]\+ ----$//;
s/--- //g');
do
- asterisk -rx "digium_phones show line $l" >> $OUTPUT;
- echo "--------" >> $OUTPUT;
- echo >> $OUTPUT;
+ asterisk -rx "digium_phones show line $l" >> $OUTPUT;
+ echo "--------" >> $OUTPUT;
+ echo >> $OUTPUT;
done
else
echo "No configurations of type $type..." >> $OUTPUT;
for f in $(echo $TEMP | sed 's/--- Configured Firmware Options --- //');
do
asterisk -rx "digium_phones show firmware $f" >> $OUTPUT;
- echo "--------" >> $OUTPUT;
- echo >> $OUTPUT;
+ echo "--------" >> $OUTPUT;
+ echo >> $OUTPUT;
done
elif [ "$type" = "translations" ];
then
for t in $(echo $TEMP | sed 's/--- Translation tables ---//');
do
- asterisk -rx "digium_phones show translation $t"
+ asterisk -rx "digium_phones show translation $t"
done
else
- NUM=$(echo $TEMP | tail -n 1 | awk -F' ' '{print $(NF-3)}');
- if [ $NUM -gt 0 ];
- then
- for t in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //;
+ NUM=$(echo $TEMP | tail -n 1 | awk -F' ' '{print $(NF-3)}');
+ if [ $NUM -gt 0 ];
+ then
+ for t in $(echo $TEMP | sed 's/^--- [[:alpha:]]\+ --- //;
s/---- [a-zA-Z0-9 ]\+ ----$//
- s/---- Digium Phones ---- //');
- do
- asterisk -rx "digium_phones show $(echo $type | sed 's/s\b//') $t" >> $OUTPUT;
- echo "--------" >> $OUTPUT;
- echo >> $OUTPUT;
- done;
- else
+ s/---- Digium Phones ---- //');
+ do
+ asterisk -rx "digium_phones show $(echo $type | sed 's/s\b//') $t" >> $OUTPUT;
+ echo "--------" >> $OUTPUT;
+ echo >> $OUTPUT;
+ done;
+ else
echo "No configurations of type $type..." >> $OUTPUT;
echo >> $OUTPUT;
fi;
.B autosupport
\(em interactive script to provide Digium[tm]'s support with information
.SH SYNOPSIS
-.PP
+.PP
.B autosupport [OPTION] [prefix]
.SH DESCRIPTION
of Asterisk related configuration. An optional parameter for a prefix
may be specified which is typically used to specify a Digium Technical
Support Ticket ID.
-.PP
-The script requires root privileges to run, and writes all output in the
-home directory of the user running the script. For the purposes of this
+.PP
+The script requires root privileges to run, and writes all output in the
+home directory of the user running the script. For the purposes of this
document, this will be referred to as /root/ henceforth.
-.PP
+.PP
The system information is written to /root/digiuminfo.txt and the backup
of configuration (and the system information file) are written to a tarball
in /root/ with a base name of digium\-info. A Date Stamp will be appended,
Show help about options
.SH FILES
.B /root/digiuminfo.txt
-.br
+.br
.B /root/digium\-info_YYYYMMDD.tar.gz
.SH SEE ALSO
Tzafrir Cohen <tzafrir.cohen@xorcom.com> and updated by Charles Moye. Permission
is granted to copy, distribute and/or modify this document under the terms of
the GNU General Public License, Version 2 any later version published by the
-Free Software Foundation.
-.PP
-On Debian systems, the complete text of the GNU General Public
-License can be found in /usr/share/common\-licenses/GPL\-2.
+Free Software Foundation.
+.PP
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common\-licenses/GPL\-2.
print STDERR $msg . "\n";
exit;
}
-
-#!/usr/bin/perl -w
+#!/usr/bin/perl -w
#
# Simple Asterisk Manager Proxy, Version 1.01
# 2004-09-26
{
log_debug("** New client connection", 16);
my $C = $m->accept;
- $proxy_clients{$C} = \$C;
+ $proxy_clients{$C} = \$C;
print "New Connection: $C\n" if $debug;
$O->add($C);
} else {
}
print "$cnt clients.\n\n";
}
-
#
# Script to expire voicemail after a specified number of days
# by Steve Creel <screel@turbs.com>
-#
+#
# Directory housing the voicemail spool for asterisk
$dir = "/var/spool/asterisk/voicemail";
# Delete all files older than $age and $unheardage
-# (named msg????.??? to get the audio and txt files,
+# (named msg????.??? to get the audio and txt files,
# but we don't delete greetings or the user's name)
if($age==$unheardage) {
# Make $dir include the context too
$dir.="/".$context;
-( -d $dir ) || die "Can't read list of mailboxes ($dir): $!\n";
+( -d $dir ) || die "Can't read list of mailboxes ($dir): $!\n";
@mailboxes = `ls -A1 $dir`;
chomp(@mailboxes);
#!/usr/bin/perl -Tw
# Use these commands to create the appropriate tables in MySQL
# If flags is 1 then this record is not included in the output extensions file
-#
+#
#CREATE TABLE extensions (
# context CHAR(20) DEFAULT 'default' NOT NULL,
# extension CHAR(20) NOT NULL,
}
my @resSet = @{$result};
- if ( $#resSet == -1 ) {
+ if ( $#resSet == -1 ) {
print "no results\n";
exit;
}
print EXTEN "\t; $result[5]" if defined $result[5];
print EXTEN "\n";
}
- }
+ }
print EXTEN "\n";
}
exit 0;
-
#
# Use these commands to create the appropriate SQL tables
# If flags is 1 then the record is not included in the output extensions file
-#
+#
#CREATE TABLE extensions (
# context VARCHAR(20) DEFAULT 'default' NOT NULL,
# extension VARCHAR(20) NOT NULL,
}
my @resSet = @{$result};
- if ( $#resSet == -1 ) {
+ if ( $#resSet == -1 ) {
print "no results\n";
exit;
}
foreach my $row ( @{ $result } ) {
my @result = @{ $row };
print EXTEN "$result[0]=$result[1]\n";
- }
+ }
print EXTEN "$additional\n";
}
exit 0;
-
.B safe_asterisk
\(em A wrapper to run the asterisk executable in a loop
.SH SYNOPSIS
-.PP
+.PP
.B safe_asterisk
.I [ asterisk_params ]
.SH DESCRIPTION
-.B safe_asterisk
-is a script that runs asterisk in a loop, which can be useful if you
+.B safe_asterisk
+is a script that runs asterisk in a loop, which can be useful if you
fear asterisk may crash.
-The script does not run in the background like a standard service. Rather,
+The script does not run in the background like a standard service. Rather,
it runs in its own linux virtual console (9, by default).
-It also uses the option '\-c' of asterisk(8) to avoid detaching asterisk
+It also uses the option '\-c' of asterisk(8) to avoid detaching asterisk
from that terminal.
-safe_asterisk also runs asterisk with unlimited core file size, and thus
+safe_asterisk also runs asterisk with unlimited core file size, and thus
asterisk will dump core in case of a crash.
-To get a "picture" of console 9, from another terminal (e.g: from a
+To get a "picture" of console 9, from another terminal (e.g: from a
remote shell session) you can use:
screendump 9
-The init script of the Debian package should be able to run safe_asterisk
-as the asterisk service, if so configured. See coments in
+The init script of the Debian package should be able to run safe_asterisk
+as the asterisk service, if so configured. See coments in
/etc/default/asterisk
.SH FILES
.B /tmp/core
.RS
-If core files were generated there, they may be
+If core files were generated there, they may be
.RE
.B /etc/asterisk/startup.d
.RE
.SH BUGS
-While showing the output on a console is useful, using screen(1) as
+While showing the output on a console is useful, using screen(1) as
the terminal may be better.
The script does not read configuration from standard location under /etc
-It uses fixed locations under /tmp , and thus may be exposed to a
+It uses fixed locations under /tmp , and thus may be exposed to a
symlink attacks.
.SH SEE ALSO
asterisk(8), screendump(9)
-.SH "AUTHOR"
-This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU General Public License, Version 2 any
-later version published by the Free Software Foundation.
+.SH "AUTHOR"
+This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 any
+later version published by the Free Software Foundation.
-On Debian systems, the complete text of the GNU General Public
-License can be found in /usr/share/common\-licenses/GPL\-2.
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common\-licenses/GPL\-2.
# sip_nat_settings: generate NAT settings for sip.conf of an Asterisk system
# that is behind a NAT router.
#
-# This is a script to generate sane defaults for externip and localnet
-# of sip.conf. The output should be included in the [general] section of
+# This is a script to generate sane defaults for externip and localnet
+# of sip.conf. The output should be included in the [general] section of
# sip.conf .
#
-# Multiple network interfaces: If you have multiple network interfaces,
-# this script will generate a 'localnet' line for each of them that has a
-# broadcast (ipv4) address, except the loopback interface (lo). You can
+# Multiple network interfaces: If you have multiple network interfaces,
+# this script will generate a 'localnet' line for each of them that has a
+# broadcast (ipv4) address, except the loopback interface (lo). You can
# later rem-out all of those you don't need.
-#
-# Alternatively, provide a network interface as a parameter an a localnet
+#
+# Alternatively, provide a network interface as a parameter an a localnet
# line will only be generated for its network.
#
# Copyright (C) 2005 by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
#console output
respawn
exec /usr/sbin/asterisk -U asterisk -g -f
-
default => custom:/var/lib/asterisk/holdmusic_raw,/usr/bin/rawplayer
-This is the most efficient way to implement moh because no cpu usage is required to
+This is the most efficient way to implement moh because no cpu usage is required to
explode the very compressed mp3 data then downsample the music to the 8khz mono on the fly
-instead the data is already stored on the disk in the format that asterisk needs it to be
-and the player does little more than pick up frames from the file and hand them to right
+instead the data is already stored on the disk in the format that asterisk needs it to be
+and the player does little more than pick up frames from the file and hand them to right
to the asterisk pipe where the audio is shared into all the channels who require it.
If you have cpu to spare and want a simple mp3 solution consider the format_mp3 from
asterisk-addons and the files based moh.
-
-
-
#define WINBUF_NUM 2400 /* number of WINSIZE windows = 1 minute */
char* winbuf;
char *end, *bs, *be;
-/* winbuf - start of buffer
- * end - end of buffer
+/* winbuf - start of buffer
+ * end - end of buffer
* bs - start of data
- * be - end of data
+ * be - end of data
*/
int command_desc; /* command transfer descriptor */
int main()
{
int ret;
-
+
atexit(finalize);
setlinebuf(stdin);
bs=be=winbuf;
speech_desc=connect_to_host("localhost",SIGNAL_PORT);
- if(speech_desc<0)
+ if(speech_desc<0)
{
perror("signal socket");
return -1;
command_desc=connect_to_host("localhost",COMMAND_PORT);
- if(command_desc<0)
+ if(command_desc<0)
{
perror("command socket");
return -1;
pthread_create(&signal_thread,NULL,readSignal,NULL);
while(connected)
- {
+ {
pthread_mutex_lock(&command_mutex);
ret=read_some(command_desc,buf,BUFSIZE);
pthread_mutex_unlock(&command_mutex);
if(ret>0)
{
buf[ret]=0;
- printf("%s",buf);
+ printf("%s",buf);
}
}
{
close(command_desc);
close(speech_desc);
- free(winbuf);
+ free(winbuf);
}
void* readStdin(void* ptr)
write_buf(command_desc,buf,strlen(buf));
pthread_mutex_unlock(&command_mutex);
#endif
- if(feof(stdin) || buf[0]=='\n')
+ if(feof(stdin) || buf[0]=='\n')
{
break;
}
int res,desc;
int opts;
struct sockaddr_in host;
-
- /* get address */
+
+ /* get address */
if(!strcmp(name,"localhost"))
address=htonl(2130706433); /*127.0.0.1*/
else
if(address==(in_addr_t)-1)
{
host_entity = gethostbyname(name); /* search for the host under this name */
-
+
if(!host_entity)
{
fprintf(stderr,"EAGI proxy: Wrong address!\n"); /* can't find anything*/
}
memset((void*)&host,0,sizeof(struct sockaddr_in));
-
+
host.sin_family=AF_INET;
host.sin_port=htons(port);
host.sin_addr.s_addr=address;
-
+
res=connect(desc,(struct sockaddr*)&host,sizeof(host));
if(res<0)
{
{
perror("Error reading");
connected=0;
- }
+ }
break;
}
- if(res==0)
+ if(res==0)
{
connected=0;
break;
}
-
+
buffer[i]=c;
i++;
}
ret=write(desc,buf,size);
if(ret<0)
{
- if(errno!=EAGAIN)
+ if(errno!=EAGAIN)
{
perror("Error writing");
connected=0;
void setnonblocking(int desc)
{
int opts;
-
+
opts = fcntl(desc,F_GETFL);
if(opts < 0)
{
}
if(fd)
close(fd);
- } else
+ } else
return -1;
-
+
return error;
}
exit(1);
}
}
-
/*! \file
* \brief print libtonozone data as Asterisk indications.conf
- */
+ */
#include <stdio.h>
#include <stdlib.h>
#define PROGRAM "zones2indication"
-void print_tone_zone_sound(struct ind_tone_zone *zone_data, const char* name,
+void print_tone_zone_sound(struct ind_tone_zone *zone_data, const char* name,
int toneid) {
int i;
for (i=0; i<DAHDI_TONE_MAX; i++) {
void print_indications(struct ind_tone_zone *zone_data) {
int i;
-
+
printf (
"[%s]\n"
"; Source: libtonezone.\n"
"\n",
zone_data->country, zone_data->description
);
-
- printf(
+
+ printf(
"ringcadence = "
);
for(i=0; ; i++) {
printf("%d",zone_data->ringcadence[i]);
}
putchar('\n');
-
+
print_tone_zone_sound(zone_data, "dial", DAHDI_TONE_DIALTONE);
print_tone_zone_sound(zone_data, "busy", DAHDI_TONE_BUSY);
print_tone_zone_sound(zone_data, "ring", DAHDI_TONE_RINGTONE);
int opt_print_all = 0;
int opt;
char* endptr = NULL;
-
+
while((opt = getopt(argc, argv, "ac:hn:")) != -1) {
switch(opt) {
case 'a':
break;
}
}
-
+
/* If we got here, the user selected no option */
usage();
return 2;
asterisk.8: asterisk.sgml
docbook2x-man asterisk.sgml
-
The vast majority of the Asterisk project documentation has been moved to the
project wiki:
-
+
https://wiki.asterisk.org/
Asterisk release tarballs contain an export of the wiki in PDF and plain text
astdb2bdb was written by Terry Wilson <twilson@digium.com>.
This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>.
-
astdb2sqlite3 was written by Terry Wilson <twilson@digium.com>.
This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>.
-
.TH "asterisk " 8 2011-02-08 "asterisk Trunk" ""
.SH NAME
asterisk
-\- All-purpose telephony server.
+\- All-purpose telephony server.
.SH SYNOPSIS
'nh
.fi
.SH DESCRIPTION
\fBasterisk\fR is a full-featured telephony server which
provides Private Branch eXchange (PBX), Interactive Voice Response (IVR),
-Automated Call Distribution (ACD), Voice over IP (VoIP) gatewaying,
+Automated Call Distribution (ACD), Voice over IP (VoIP) gatewaying,
Conferencing, and a plethora of other telephony applications to a broad
range of telephony devices including packet voice (SIP, IAX2, MGCP, Skinny,
H.323, Unistim) devices (both endpoints and proxies), as well as traditional TDM
in the foreground). However running it with \*(T<\fB\-r\fR\*(T> or
\*(T<\fB\-R\fR\*(T> connects to an existing Asterisk instance through
a remote console.
-.TP
+.TP
\-B
Force the background of the terminal to be black, in order for
terminal colors to show up properly. Equivalent to
\*(T<\fBforceblackbackground = yes\fR\*(T> in
\*(T<\fIasterisk.conf\fR\*(T>. See also
\*(T<\fB\-n\fR\*(T> and \*(T<\fB\-W\fR\*(T>.
-.TP
+.TP
\-C \fIfile\fR
Use \*(T<\fIfile\fR\*(T> as master configuration file
instead of the default, /etc/asterisk/asterisk.conf
-.TP
+.TP
\-c
Provide a control console on the calling terminal. The
console is similar to the remote console provided by
-\*(T<\fB\-r\fR\*(T>. Specifying this option implies
-\fB\-f\fR and will cause asterisk to no longer
-fork or detach from the controlling terminal. Equivalent
+\*(T<\fB\-r\fR\*(T>. Specifying this option implies
+\fB\-f\fR and will cause asterisk to no longer
+fork or detach from the controlling terminal. Equivalent
to \*(T<\fBconsole = yes\fR\*(T> in \*(T<\fIasterisk.conf\fR\*(T>.
-.TP
+.TP
\-d
Enable extra debugging statements. This parameter may be used several
times, and each increases the debug level. Equivalent to \*(T<\fBdebug = \fR\*(T>\fInum\fR
option also implies \*(T<\fB\-f\fR\*(T> (no forking). However when
connecting to an existing Asterisk instance (\*(T<\fB\-r\fR\*(T> or
\*(T<\fB\-R\fR\*(T>), it may only increase the debug level.
-.TP
+.TP
\-e \fImemory\fR
-Limit the generation of new channels when the amount of free memory
+Limit the generation of new channels when the amount of free memory
has decreased to under \fImemory\fR megabytes.
Equivalent to \*(T<\fBminmemfree = \fR\*(T>\fImemory\fR in
\*(T<\fIasterisk.conf\fR\*(T>.
-.TP
+.TP
\-f
Do not fork or detach from controlling terminal. Overrides any
preceding specification of \fB\-F\fR on the command line.
Equivalent to \*(T<\fBnofork = yes\fR\*(T> in \*(T<\fIasterisk.conf\fR\*(T>.
See also \*(T<\fB\-c\fR\*(T>.
-.TP
+.TP
\-F
Always fork and detach from controlling terminal. Overrides any
preceding specification of \fB\-f\fR on the command line.
May also be used to prevent \*(T<\fB\-d\fR\*(T> and \*(T<\fB\-v\fR\*(T> to imply
no forking. Equivalent to \*(T<\fBalwaysfork = yes\fR\*(T> in \*(T<\fIasterisk.conf\fR\*(T>.
-.TP
+.TP
\-g
Remove resource limit on core size, thus forcing Asterisk to dump
core in the unlikely event of a segmentation fault or abort signal.
\fBNOTE:\fR in some cases this may be incompatible
with the \fB\-U\fR or \fB\-G\fR flags.
-.TP
+.TP
\-G \fIgroup\fR
Run as group \fIgroup\fR instead of the
calling group. \fBNOTE:\fR this requires substantial work
to be sure that Asterisk's environment has permission to write
the files required for its operation, including logs, its comm
socket, the asterisk database, etc.
-.TP
+.TP
\-h
Provide brief summary of command line arguments and terminate.
-.TP
+.TP
\-i
Prompt user to intialize any encrypted private keys for IAX2
secure authentication during startup.
-.TP
+.TP
\-I
Enable internal timing if DAHDI timing is available.
The default behaviour is that outbound packets are phase locked
to inbound packets. Enabling this switch causes them to be
locked to the internal DAHDI timer instead.
-.TP
+.TP
\-L \fIloadaverage\fR
Limits the maximum load average before rejecting new calls. This can
be useful to prevent a system from being brought down by terminating
too many simultaneous calls.
-.TP
+.TP
\-m
Temporarily mutes output to the console and logs. To return to normal,
use \fBlogger mute\fR.
-.TP
+.TP
\-M \fIvalue\fR
Limits the maximum number of calls to the specified value. This can
be useful to prevent a system from being brought down by terminating
too many simultaneous calls.
-.TP
+.TP
\-n
Disable ANSI colors even on terminals capable of displaying them.
-.TP
+.TP
\-p
If supported by the operating system (and executing as root),
attempt to run with realtime priority for increased performance and
\fBasterisk\fR. If \fBastcanary\fR stops
running or is killed, \fBasterisk\fR will slow down to
normal process priority, to avoid locking up the machine.
-.TP
+.TP
\-q
Reduce default console output when running in conjunction with
console mode (\fB\-c\fR).
-.TP
+.TP
\-r
Instead of running a new Asterisk process, attempt to connect
to a running Asterisk process and provide a console interface
for controlling it.
-.TP
+.TP
\-R
Much like \fB\-r\fR. Instead of running a new Asterisk process, attempt to connect
to a running Asterisk process and provide a console interface
-for controlling it. Additionally, if connection to the Asterisk
+for controlling it. Additionally, if connection to the Asterisk
process is lost, attempt to reconnect for as long as 30 seconds.
-.TP
+.TP
\-s \fIsocket file name\fR
In combination with \fB\-r\fR, connect directly to a specified
Asterisk server socket.
-.TP
+.TP
\-t
-When recording files, write them first into a temporary holding directory,
+When recording files, write them first into a temporary holding directory,
then move them into the final location when done.
-.TP
+.TP
\-T
Add timestamp to all non-command related output going to the console
when running with verbose and/or logging to the console.
-.TP
+.TP
\-U \fIuser\fR
Run as user \fIuser\fR instead of the
calling user. \fBNOTE:\fR this requires substantial work
to be sure that Asterisk's environment has permission to write
the files required for its operation, including logs, its comm
socket, the asterisk database, etc.
-.TP
+.TP
\-v
Increase the level of verboseness on the console. The more times
\fB\-v\fR is specified, the more verbose the output is.
Note: This always sets the verbose level in the asterisk process,
even if it is running in the background. This will affect the size
of your log files.
-.TP
+.TP
\-V
Display version information and exit immediately.
-.TP
+.TP
\-W
Display colored terminal text as if the background were white
or otherwise light in color. Normally, terminal text is displayed
as if the background were black or otherwise dark in color.
-.TP
+.TP
\-x \fIcommand\fR
Connect to a running Asterisk process and execute a command on
a command line, passing any output through to standard out and
then terminating when the command execution completes. Implies
\fB\-r\fR when \fB\-R\fR is not explicitly
supplied.
-.TP
+.TP
\-X
Enables executing of includes via \fB#exec\fR directive.
This can be useful if You want to do \fB#exec\fR inside
<para>
<command>asterisk</command> is a full-featured telephony server which
provides Private Branch eXchange (PBX), Interactive Voice Response (IVR),
- Automated Call Distribution (ACD), Voice over IP (VoIP) gatewaying,
+ Automated Call Distribution (ACD), Voice over IP (VoIP) gatewaying,
Conferencing, and a plethora of other telephony applications to a broad
range of telephony devices including packet voice (SIP, IAX2, MGCP, Skinny,
H.323, Unistim) devices (both endpoints and proxies), as well as traditional TDM
<para>
Provide a control console on the calling terminal. The
console is similar to the remote console provided by
- <option>-r</option>. Specifying this option implies
- <command>-f</command> and will cause asterisk to no longer
- fork or detach from the controlling terminal. Equivalent
+ <option>-r</option>. Specifying this option implies
+ <command>-f</command> and will cause asterisk to no longer
+ fork or detach from the controlling terminal. Equivalent
to <option>console = yes</option> in <filename>asterisk.conf</filename>.
</para>
</listitem>
<term>-e <replaceable class="parameter">memory</replaceable></term>
<listitem>
<para>
- Limit the generation of new channels when the amount of free memory
+ Limit the generation of new channels when the amount of free memory
has decreased to under <replaceable>memory</replaceable> megabytes.
Equivalent to <option>minmemfree = <replaceable>memory</replaceable></option> in
<filename>asterisk.conf</filename>.
<para>
Much like <command>-r</command>. Instead of running a new Asterisk process, attempt to connect
to a running Asterisk process and provide a console interface
- for controlling it. Additionally, if connection to the Asterisk
+ for controlling it. Additionally, if connection to the Asterisk
process is lost, attempt to reconnect for as long as 30 seconds.
</para>
</listitem>
<term>-t</term>
<listitem>
<para>
- When recording files, write them first into a temporary holding directory,
+ When recording files, write them first into a temporary holding directory,
then move them into the final location when done.
</para>
</listitem>
<title>AUTHOR</title>
<para>
<author>
- <firstname>Mark Spencer <markster@digium.com></firstname>
+ <firstname>Mark Spencer <markster@digium.com></firstname>
</author>
</para>
<para>
<author>
- <firstname>Countless other contributors, see CREDITS with distribution for more information.</firstname>
+ <firstname>Countless other contributors, see CREDITS with distribution for more information.</firstname>
</author>
</para>
</refsect1>
bash-3.2# more CREDITS
Recorded by:
Allison Smith (https://www.theivrvoice.com)
-
+
Financial Contributions by: Digium, Inc. (https://www.digium.com)
bash-3.2#
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for file format modules
#
# Copyright (C) 1999-2006, Digium, Inc.
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
.unload = unload_module,
.load_pri = AST_MODPRI_APP_DEPEND
);
-
* at the top of the source tree.
*/
-/*!
+/*!
* \file
*
* \brief Old-style G.723.1 frame/timestamp format.
- *
+ *
* \arg Extensions: g723, g723sf
* \ingroup formats
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
int delay;
/* Read the delay for the next packet, and schedule again if necessary */
/* XXX is this ignored ? */
- if (fread(&delay, 1, 4, s->f) == 4)
+ if (fread(&delay, 1, 4, s->f) == 4)
delay = ntohl(delay);
else
delay = -1;
if (size > G723_MAX_SIZE) {
ast_log(LOG_WARNING, "Size %d is invalid\n", size);
/* The file is apparently no longer any good, as we
- shouldn't ever get frames even close to this
+ shouldn't ever get frames even close to this
size. */
return NULL;
}
if ((res = fwrite(f->data.ptr, 1, f->datalen, s->f)) != f->datalen) {
ast_log(LOG_WARNING, "Unable to write frame: res=%d (%s)\n", res, strerror(errno));
return -1;
- }
+ }
return 0;
}
/*!\file
*
* \brief Headerless G.726 (16/24/32/40kbps) data format for Asterisk.
- *
+ *
* File name extensions:
* \arg 40 kbps: g726-40
* \arg 32 kbps: g726-32
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define BUF_SIZE (5*FRAME_TIME) /* max frame size in bytes ? */
/* Frame sizes in bytes */
-static int frame_size[4] = {
+static int frame_size[4] = {
FRAME_TIME * 5,
FRAME_TIME * 4,
FRAME_TIME * 3,
struct g726_desc *fs = (struct g726_desc *)s->_private;
if (f->datalen % frame_size[fs->rate]) {
- ast_log(LOG_WARNING, "Invalid data length %d, should be multiple of %d\n",
+ ast_log(LOG_WARNING, "Invalid data length %d, should be multiple of %d\n",
f->datalen, frame_size[fs->rate]);
return -1;
}
if ((res = fwrite(f->data.ptr, 1, f->datalen, s->f)) != f->datalen) {
- ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n",
+ ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n",
res, frame_size[fs->rate], strerror(errno));
return -1;
}
* \note This is not an encoder/decoder. The codec for g729 is only
* available with a commercial license from Digium, due to patent
* restrictions. Check http://www.digium.com for information.
- * \arg Extensions: g729
+ * \arg Extensions: g729
* \ingroup formats
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
cur = ftello(fs->f);
fseeko(fs->f, 0, SEEK_END);
max = ftello(fs->f);
-
+
bytes = BUF_SIZE * (sample_offset / G729A_SAMPLES);
if (whence == SEEK_SET)
offset = bytes;
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
* Asterisk -- An open source telephony toolkit.
*
* Brian K. West <brian@bkw.org>
- *
+ *
* Copyright (C) 1999 - 2005, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
cur = ftello(fs->f);
fseeko(fs->f, 0, SEEK_END);
max = ftello(fs->f);
-
+
bytes = ILBC_BUF_SIZE * (sample_offset / ILBC_SAMPLES);
if (whence == SEEK_SET)
offset = bytes;
/*! \file
*
* \brief JPEG File format support.
- *
+ *
* \arg File name extension: jpeg, jpg
* \ingroup formats
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
ogg_stream_state os;
ogg_page og;
ogg_packet op;
-
+
/* structures for handling Vorbis audio data */
vorbis_info vi;
vorbis_comment vc;
vorbis_dsp_state vd;
vorbis_block vb;
-
+
/*! \brief Indicates whether this filestream is set up for reading or writing. */
int writing;
* \brief Seek to a specific position in an OGG/Vorbis filestream.
* \param fs The filestream to take action on.
* \param sample_offset New position for the filestream, measured in 8KHz samples.
- * \param whence Location to measure
+ * \param whence Location to measure
* \return 0 on success, -1 on failure.
*/
static int ogg_vorbis_seek(struct ast_filestream *fs, off_t sample_offset, int whence)
*
* \brief Flat, binary, ulaw PCM file format.
* \arg File name extension: alaw, al, alw, pcm, ulaw, ul, mu, ulw, g722, au
- *
+ *
* \ingroup formats
*/
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/* Check if we have written to this position yet. If we have, then increment pos by one frame
* for some degree of protection against receiving packets in the same clock tick.
*/
-
+
fstat(fileno(fs->f), &stat_buf );
if (stat_buf.st_size > fpos )
fpos += f->datalen; /* Incrementing with the size of this current frame */
}
}
#endif /* REALTIME_WRITE */
-
+
if ((res = fwrite(f->data.ptr, 1, f->datalen, fs->f)) != f->datalen) {
ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno));
return -1;
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
*
* \brief Flat, binary, ADPCM vox file format.
* \arg File name extensions: vox
- *
+ *
* \ingroup formats
*/
<defaultenabled>no</defaultenabled>
<support_level>extended</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
{
off_t offset;
offset = ftello(fs->f) << 1;
- return offset;
+ return offset;
}
static struct ast_format_def vox_f = {
* \arg File name extension: wav (lower case)
* \ingroup formats
*/
-
+
/*** MODULEINFO
<support_level>core</support_level>
***/
}
/* Skip any facts and get the first data block */
for(;;)
- {
+ {
char buf[4];
-
+
/* Begin data chunk */
if (fread(&buf, 1, 4, f) != 4) {
ast_log(LOG_WARNING, "Read failed (block header format)\n");
return -1;
continue;
}
- if(memcmp(buf, "data", 4) == 0 )
+ if(memcmp(buf, "data", 4) == 0 )
break;
ast_log(LOG_DEBUG, "Skipping unknown block '%.4s'\n", buf);
if (fseek(f,data,SEEK_CUR) == -1 ) {
truelength = lseek(fd, 0, SEEK_END);
lseek(fd, curpos, SEEK_SET);
truelength -= curpos;
-#endif
+#endif
return data;
}
{
off_t cur,end;
int datalen,filelen,bytes;
-
+
cur = ftello(f);
fseek(f, 0, SEEK_END);
end = ftello(f);
datalen = htoll(bytes);
/* chunk size is bytes of data plus 36 bytes of header */
filelen = htoll(36 + bytes);
-
+
if (cur < 0) {
ast_log(LOG_WARNING, "Unable to find our position\n");
return -1;
return -1;
}
tmpi = f->data.ptr;
- for (x=0; x < f->datalen/2; x++)
+ for (x=0; x < f->datalen/2; x++)
tmp[x] = (tmpi[x] << 8) | ((tmpi[x] & 0xff00) >> 8);
if ((res = fwrite(tmp, 1, f->datalen, fs->f)) != f->datalen ) {
}
s->bytes += f->datalen;
-
+
return 0;
}
/*! \file
*
* \brief Save GSM in the proprietary Microsoft format.
- *
+ *
* Microsoft WAV format (Proprietary GSM)
* \arg File name extension: WAV,wav49 (Upper case WAV, lower case is another format)
* This format can be played on Windows systems, used for
/*** MODULEINFO
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
gsm_byte frame_chain;
unsigned int sr;
unsigned int LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
-
+
readGSM_33(d);
sr = 0;
sr = (sr >> 6) | (LARc[0] << 10);
unsigned int LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4];
/* silence bogus compiler warning */
unsigned int xmc[13*4] = { 0, };
-
+
sr = *c++;
LARc[0] = sr & 0x3f; sr >>= 6;
sr |= (uword)*c++ << 2;
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for dialplan functions
#
# Copyright (C) 2005-2006, Digium, Inc.
}
}
AST_MODULE_INFO_STANDARD_DEPRECATED(ASTERISK_GPL_KEY, "Audiohook inheritance placeholder function");
-
/*! \file
*
* \brief Use the base64 as functions
- *
+ *
* \ingroup functions
*/
* \author Mark Spencer <markster@digium.com>
*
* \ingroup functions
- *
+ *
*/
/*** MODULEINFO
*
* \author Russell Bryant <russell@digium.com>
* \author Tilghman Lesher <func_config__200803@the-tilghman.com>
- *
+ *
* \ingroup functions
*/
ast_log(LOG_ERROR, "AST_CONFIG() requires a category\n");
return -1;
}
-
+
if (ast_strlen_zero(args.variable)) {
ast_log(LOG_ERROR, "AST_CONFIG() requires a variable\n");
return -1;
*/
/*! \file
- *
+ *
* \brief Curl - Load a URL
*
* \author Tilghman Lesher <curl-20050919@the-tilghman.com>
*
- * \note Brian Wilkins <bwilkins@cfl.rr.com> (Added POST option)
+ * \note Brian Wilkins <bwilkins@cfl.rr.com> (Added POST option)
*
* \extref Depends on the CURL library - http://curl.haxx.se/
- *
+ *
* \ingroup functions
*/
-
+
/*** MODULEINFO
<depend>curl</depend>
<support_level>core</support_level>
.unload = unload_module,
.load_pri = AST_MODPRI_REALTIME_DEPEND2,
);
-
*/
/*! \file
- *
+ *
* \brief CUT function
*
* \author Tilghman Lesher <app_cut__v003@the-tilghman.com>
/*** DOCUMENTATION
<function name="SORT" language="en_US">
<synopsis>
- Sorts a list of key/vals into a list of keys, based upon the vals.
+ Sorts a list of key/vals into a list of keys, based upon the vals.
</synopsis>
<syntax>
<parameter name="keyval" required="true" argsep=":">
</function>
<function name="CUT" language="en_US">
<synopsis>
- Slices and dices strings, based upon a named delimiter.
+ Slices and dices strings, based upon a named delimiter.
</synopsis>
<syntax>
<parameter name="varname" required="true">
</syntax>
<description>
<para>Cut out information from a string (<replaceable>varname</replaceable>), based upon a named delimiter.</para>
- </description>
+ </description>
</function>
***/
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 2005-2006, Russell Bryant <russelb@clemson.edu>
+ * Copyright (C) 2005-2006, Russell Bryant <russelb@clemson.edu>
*
- * func_db.c adapted from the old app_db.c, copyright by the following people
+ * func_db.c adapted from the old app_db.c, copyright by the following people
* Copyright (C) 2005, Mark Spencer <markster@digium.com>
* Copyright (C) 2003, Jefferson Noxon <jeff@debian.org>
*
*
* Copyright (C) 2007, Digium, Inc.
*
- * Russell Bryant <russell@digium.com>
+ * Russell Bryant <russell@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
*
* \brief Manually controlled blinky lights
*
- * \author Russell Bryant <russell@digium.com>
+ * \author Russell Bryant <russell@digium.com>
*
* \ingroup functions
*
*
* \author Gregory Nietsky AKA irroot <gregory@networksentry.co.za>
* \author Russell Bryant <russell@digium.com>
- *
+ *
* \ingroup functions
*/
<parameter name="resultnum" required="true">
<para>The number of the result that you want to retrieve.</para>
<para>Results start at <literal>1</literal>. If this argument is specified
- as <literal>getnum</literal>, then it will return the total number of results
+ as <literal>getnum</literal>, then it will return the total number of results
that are available or -1 on error.</para>
</parameter>
</syntax>
<para>This function will retrieve results from a previous use
of the ENUMQUERY function.</para>
</description>
- </function>
+ </function>
<function name="ENUMLOOKUP" language="en_US">
<synopsis>
General or specific querying of NAPTR records for ENUM or ENUM-like DNS pointers.
<option name="d">
<para>for a direct DNS lookup without any flipping of digits.</para>
</option>
- </optionlist>
+ </optionlist>
</parameter>
<parameter name="record#">
- <para>If no <replaceable>record#</replaceable> is given,
+ <para>If no <replaceable>record#</replaceable> is given,
defaults to <literal>1</literal>.</para>
</parameter>
<parameter name="zone-suffix">
unsigned int id;
};
-static void erds_destroy(struct enum_result_datastore *data)
+static void erds_destroy(struct enum_result_datastore *data)
{
int k;
ast_free(data);
}
-static void erds_destroy_cb(void *data)
+static void erds_destroy_cb(void *data)
{
struct enum_result_datastore *erds = data;
erds_destroy(erds);
static const struct ast_datastore_info enum_result_datastore_info = {
.type = "ENUMQUERY",
.destroy = erds_destroy_cb,
-};
+};
static int enum_query_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)
{
}
parse = ast_strdupa(data);
-
+
AST_STANDARD_APP_ARGS(args, parse);
if (!chan) {
ast_channel_lock(chan);
ast_channel_datastore_add(chan, datastore);
ast_channel_unlock(chan);
-
+
res = 0;
-
+
finish:
return res;
char *parse, *p;
unsigned int num;
int res = -1, k;
- AST_DECLARE_APP_ARGS(args,
+ AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(id);
AST_APP_ARG(resultnum);
);
ast_log(LOG_ERROR, "ENUMRESULT can not be used without a channel!\n");
goto finish;
}
-
+
parse = ast_strdupa(data);
AST_STANDARD_APP_ARGS(args, parse);
continue;
p = strchr(erds->context->naptr_rrs[k].result, ':');
-
+
if (p && strcasecmp(erds->context->naptr_rrs[k].tech, "ALL"))
ast_copy_string(buf, p + 1, len);
else
*
* Copyright (C) 2007, Digium, Inc.
*
- * Modified from func_devstate.c by Russell Bryant <russell@digium.com>
+ * Modified from func_devstate.c by Russell Bryant <russell@digium.com>
* Adam Gundy <adam@starsilk.net>
* See http://www.asterisk.org for more information about
*
* \brief Get the state of a hinted extension for dialplan control
*
- * \author Adam Gundy <adam@starsilk.net>
+ * \author Adam Gundy <adam@starsilk.net>
*
* \ingroup functions
*/
<function name="EXTENSION_STATE" language="en_US">
<synopsis>
Get an extension's state.
- </synopsis>
+ </synopsis>
<syntax argsep="@">
<parameter name="extension" required="true" />
<parameter name="context">
return -1;
}
- ast_copy_string(buf,
+ ast_copy_string(buf,
ast_extstate_str(ast_extension_state(chan, context, exten)), len);
return 0;
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Frame Trace for internal ast_frame debugging.");
-
-
<para>Implements a shared variable area, in which you may share variables between
channels.</para>
<para>The variables used in this space are separate from the general namespace of
- the channel and thus <variable>SHARED(foo)</variable> and <variable>foo</variable>
+ the channel and thus <variable>SHARED(foo)</variable> and <variable>foo</variable>
represent two completely different variables, despite sharing the same name.</para>
<para>Finally, realize that there is an inherent race between channels operating
at the same time, fiddling with each others' internal variables, which is why
/*! \file
*
* \brief Channel group related dialplan functions
- *
+ *
* \ingroup functions
*/
</parameter>
</syntax>
<description>
- <para><replaceable>category</replaceable> can be employed for more fine grained group management. Each channel
+ <para><replaceable>category</replaceable> can be employed for more fine grained group management. Each channel
can only be member of exactly one group per <replaceable>category</replaceable>.</para>
</description>
</function>
if (!ast_strlen_zero(gi->category) && !strcasecmp(gi->category, data))
break;
}
-
+
if (gi) {
ast_copy_string(buf, gi->group, len);
ret = 0;
}
-
+
ast_app_group_list_unlock();
-
+
return ret;
}
snprintf(tmp1, sizeof(tmp1), "%s", gi->group);
}
}
-
+
ast_app_group_list_unlock();
ast_copy_string(buf, tmp1, len);
/*** DOCUMENTATION
<function name="ICONV" language="en_US">
<synopsis>
- Converts charsets of strings.
+ Converts charsets of strings.
</synopsis>
<syntax>
<parameter name="in-charset" required="true">
***/
-/*!
+/*!
* Some systems define the second arg to iconv() as (const char *),
- * while others define it as (char *). Cast it to a (void *) to
- * suppress compiler warnings about it.
+ * while others define it as (char *). Cast it to a (void *) to
+ * suppress compiler warnings about it.
*/
#define AST_ICONV_CAST void *
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Charset conversions");
-
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Jitter buffer for read side of channel.");
-
* \author Tilghman Lesher <func_lock_2007@the-tilghman.com>
*
* \ingroup functions
- *
+ *
*/
/*** MODULEINFO
</syntax>
<description>
<para>Attempts to grab a named lock exclusively, and prevents other channels
- from obtaining the same lock. Returns <literal>1</literal> if the lock was
+ from obtaining the same lock. Returns <literal>1</literal> if the lock was
available or <literal>0</literal> otherwise.</para>
<note>
<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
<parameter name="lockname" required="true" />
</syntax>
<description>
- <para>Unlocks a previously locked mutex. Returns <literal>1</literal> if the channel
+ <para>Unlocks a previously locked mutex. Returns <literal>1</literal> if the channel
had a lock or <literal>0</literal> otherwise.</para>
- <note><para>It is generally unnecessary to unlock in a hangup routine, as any locks
+ <note><para>It is generally unnecessary to unlock in a hangup routine, as any locks
held are automatically freed when the channel is destroyed.</para></note>
<note>
<para>If <literal>live_dangerously</literal> in <literal>asterisk.conf</literal>
*/
/*! \file
- *
+ *
* \brief Conditional logic dialplan functions
- *
+ *
* \author Anthony Minessale II
*
* \ingroup functions
</syntax>
<description>
<para>Returns the data following <literal>?</literal> if true, else the data following <literal>:</literal></para>
- </description>
+ </description>
</function>
<function name="IFTIME" language="en_US">
<synopsis>
-- and if you mod the ast_app_separate_args func instead, you'll really
mess things up badly, because the rest of everything depends on null args
for non-specified stuff. */
-
+
AST_NONSTANDARD_APP_ARGS(args1, data, '?');
AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
*
* Copyright (C) 2005-2006, Digium, Inc.
* Copyright (C) 2005, Olle E. Johansson, Edvina.net
- * Copyright (C) 2005, Russell Bryant <russelb@clemson.edu>
+ * Copyright (C) 2005, Russell Bryant <russelb@clemson.edu>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
/*! \file
*
* \brief MD5 digest related dialplan functions
- *
+ *
* \author Olle E. Johansson <oej@edvina.net>
* \author Russell Bryant <russelb@clemson.edu>
*
<parameter name="result-id" required="true" />
</syntax>
<description>
- <para>For queries which are marked as mode=multirow, the original
- query returns a <replaceable>result-id</replaceable> from which results
+ <para>For queries which are marked as mode=multirow, the original
+ query returns a <replaceable>result-id</replaceable> from which results
may be fetched. This function implements the actual fetch of the results.</para>
<para>This also sets <variable>ODBC_FETCH_STATUS</variable>.</para>
<variablelist>
<parameter name="result-id" required="true" />
</syntax>
<description>
- <para>For queries which are marked as mode=multirow, this will clear
+ <para>For queries which are marked as mode=multirow, this will clear
any remaining rows of the specified resultset.</para>
</description>
</application>
<parameter name="string" required="true" />
</syntax>
<description>
- <para>Used in SQL templates to escape data which may contain single ticks
+ <para>Used in SQL templates to escape data which may contain single ticks
<literal>'</literal> which are otherwise used to delimit data.</para>
<para>Example: SELECT foo FROM bar WHERE baz='${SQL_ESC(${ARG1})}'</para>
</description>
.unload = unload_module,
.reload = reload,
);
-
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Audio Effects Dialplan Functions");
-
*
* Copyright (C) 2011, Digium, Inc.
*
- * David Vossel <dvossel@digium.com>
+ * David Vossel <dvossel@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
int value;
const char *subtype;
const char *message;
- const char *options;
+ const char *options;
} outputs;
};
char *message;
char *options;
enum ast_test_result_state res = AST_TEST_PASS;
-
+
struct test_string tests [] = {
{ "away",
{ AST_PRESENCE_AWAY,
.unload = unload_module,
.load_pri = AST_MODPRI_DEVSTATE_PROVIDER,
);
-
/*! \file
*
* \brief Generate Random Number
- *
+ *
* \author Claude Patry <cpatry@gmail.com>
* \author Tilghman Lesher ( http://asterisk.drunkcoder.com/ )
* \ingroup functions
/*** DOCUMENTATION
<function name="RAND" language="en_US">
<synopsis>
- Choose a random number in a range.
+ Choose a random number in a range.
</synopsis>
<syntax>
<parameter name="min" />
<parameter name="max" />
</syntax>
<description>
- <para>Choose a random number between <replaceable>min</replaceable> and <replaceable>max</replaceable>.
- <replaceable>min</replaceable> defaults to <literal>0</literal>, if not specified, while <replaceable>max</replaceable> defaults
+ <para>Choose a random number between <replaceable>min</replaceable> and <replaceable>max</replaceable>.
+ <replaceable>min</replaceable> defaults to <literal>0</literal>, if not specified, while <replaceable>max</replaceable> defaults
to <literal>RAND_MAX</literal> (2147483647 on many systems).</para>
<para>Example: Set(junky=${RAND(1,8)});
Sets junky to a random number between 1 and 8, inclusive.</para>
/*! \file
*
* \brief SHA1 digest related dialplan functions
- *
+ *
* \author Claude Patry <cpatry@gmail.com>
*
* \ingroup functions
<para>Generate a SHA1 digest via the SHA1 algorythm.</para>
<para>Example: Set(sha1hash=${SHA1(junky)})</para>
<para>Sets the asterisk variable sha1hash to the string <literal>60fa5675b9303eb62f99a9cd47f9f5837d18f9a0</literal>
- which is known as his hash</para>
+ which is known as his hash</para>
</description>
</function>
***/
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Get a field from a sorcery object");
-
* Copyright (C) 2008, Digium, Inc.
*
* Brian Degenhardt <bmd@digium.com>
- * Brett Bryant <bbryant@digium.com>
+ * Brett Bryant <bbryant@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
*
* \brief Noise reduction and automatic gain control (AGC)
*
- * \author Brian Degenhardt <bmd@digium.com>
- * \author Brett Bryant <bbryant@digium.com>
+ * \author Brian Degenhardt <bmd@digium.com>
+ * \author Brett Bryant <bbryant@digium.com>
*
* \ingroup functions
*
channel that it is executed on. Using <literal>rx</literal> for audio received
and <literal>tx</literal> for audio transmitted to the channel. When using this
function you set a target audio level. It is primarily intended for use with
- analog lines, but could be useful for other channels as well. The target volume
+ analog lines, but could be useful for other channels as well. The target volume
is set with a number between <literal>1-32768</literal>. The larger the number
the louder (more gain) the channel will receive.</para>
<para>Examples:</para>
</synopsis>
<syntax>
<parameter name="channeldirection" required="true">
- <para>This can be either <literal>rx</literal> or <literal>tx</literal>
+ <para>This can be either <literal>rx</literal> or <literal>tx</literal>
the values that can be set to this are either <literal>on</literal> and
<literal>off</literal></para>
</parameter>
struct speex_direction_info *tx, *rx;
};
-static void destroy_callback(void *data)
+static void destroy_callback(void *data)
{
struct speex_info *si = data;
if (!strcasecmp(cmd, "agc")) {
if (!sscanf(value, "%30f", &(*sdi)->agclevel))
(*sdi)->agclevel = ast_true(value) ? DEFAULT_AGC_LEVEL : 0.0;
-
+
if ((*sdi)->agclevel > 32768.0) {
- ast_log(LOG_WARNING, "AGC(%s)=%.01f is greater than 32768... setting to 32768 instead\n",
+ ast_log(LOG_WARNING, "AGC(%s)=%.01f is greater than 32768... setting to 32768 instead\n",
((*sdi == si->rx) ? "rx" : "tx"), (*sdi)->agclevel);
(*sdi)->agclevel = 32768.0;
}
-
+
(*sdi)->agc = !!((*sdi)->agclevel);
if ((*sdi)->state) {
ast_audiohook_remove(chan, &si->audiohook);
ast_audiohook_detach(&si->audiohook);
}
-
+
ast_datastore_free(datastore);
}
- if (is_new) {
+ if (is_new) {
datastore->data = si;
ast_channel_lock(chan);
ast_channel_datastore_add(chan, datastore);
* \brief String manipulation dialplan functions
*
* \author Tilghman Lesher
- * \author Anothony Minessale II
+ * \author Anothony Minessale II
* \ingroup functions
*/
<parameter name="argN" />
</syntax>
<description>
- <para>Parses the format string specified and returns a string matching
+ <para>Parses the format string specified and returns a string matching
that format. Supports most options found in <emphasis>sprintf(3)</emphasis>.
Returns a shortened string if a format specifier is not recognized.</para>
</description>
ast_log(LOG_WARNING, "%s requires a service as an argument\n", cmd);
return -1;
}
-
+
/* If they already called SRVQUERY for this service once,
* we need to kill the old datastore.
*/
ast_channel_datastore_remove(chan, datastore);
ast_datastore_free(datastore);
}
-
+
if (!srv_datastore_setup(data, chan)) {
return -1;
}
* \brief String manipulation dialplan functions
*
* \author Tilghman Lesher
- * \author Anothony Minessale II
+ * \author Anothony Minessale II
* \ingroup functions
*/
<parameter name="string" required="true" />
</syntax>
<description>
- <para>Permits all characters listed in <replaceable>allowed-chars</replaceable>,
- filtering all others outs. In addition to literally listing the characters,
+ <para>Permits all characters listed in <replaceable>allowed-chars</replaceable>,
+ filtering all others outs. In addition to literally listing the characters,
you may also use ranges of characters (delimited by a <literal>-</literal></para>
<para>Hexadecimal characters started with a <literal>\x</literal>(i.e. \x20)</para>
<para>Octal characters started with a <literal>\0</literal> (i.e. \040)</para>
- <para>Also <literal>\t</literal>,<literal>\n</literal> and <literal>\r</literal> are recognized.</para>
- <note><para>If you want the <literal>-</literal> character it needs to be prefixed with a
+ <para>Also <literal>\t</literal>,<literal>\n</literal> and <literal>\r</literal> are recognized.</para>
+ <note><para>If you want the <literal>-</literal> character it needs to be prefixed with a
<literal>\</literal></para></note>
</description>
</function>
</syntax>
<description>
<para>Return <literal>1</literal> on regular expression match or <literal>0</literal> otherwise</para>
- <para>Please note that the space following the double quotes separating the
- regex from the data is optional and if present, is skipped. If a space is
- desired at the beginning of the data, then put two spaces there; the second
+ <para>Please note that the space following the double quotes separating the
+ regex from the data is optional and if present, is skipped. If a space is
+ desired at the beginning of the data, then put two spaces there; the second
will not be skipped.</para>
</description>
</function>
<parameter name="hashname" required="true" />
</syntax>
<description>
- <para>Returns a comma-delimited list of the current keys of the associative array
- defined by the HASH() function. Note that if you iterate over the keys of
+ <para>Returns a comma-delimited list of the current keys of the associative array
+ defined by the HASH() function. Note that if you iterate over the keys of
the result, adding keys during iteration will cause the result of the HASHKEYS()
function to change.</para>
</description>
<parameter name="varN" required="false" />
</syntax>
<description>
- <para>The comma-delimited list passed as a value to which the function is set will
- be interpreted as a set of values to which the comma-delimited list of
+ <para>The comma-delimited list passed as a value to which the function is set will
+ be interpreted as a set of values to which the comma-delimited list of
variable names in the argument should be set.</para>
<para>Example: Set(ARRAY(var1,var2)=1,2) will set var1 to 1 and var2 to 2</para>
</description>
<parameter name="format" required="true" />
</syntax>
<description>
- <para>This is useful for converting a date into <literal>EPOCH</literal> time,
+ <para>This is useful for converting a date into <literal>EPOCH</literal> time,
possibly to pass to an application like SayUnixTime or to calculate the difference
between the two date strings</para>
<para>Example: ${STRPTIME(2006-03-01 07:30:35,America/Chicago,%Y-%m-%d %H:%M:%S)} returns 1141219835</para>
NoOp(var is three) being executed.
</para>
</description>
- </function>
+ </function>
<function name="POP" language="en_US">
<synopsis>
Removes and returns the last item off of a variable containing delimited text
NoOp(var is one) being executed.
</para>
</description>
- </function>
+ </function>
<function name="PUSH" language="en_US">
<synopsis>
Appends one or more values to the end of a variable containing delimited text
ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, parse, buf);
return -1;
}
-
+
strcpy(buf, regexec(®exbuf, args.str, 0, NULL, 0) ? "0" : "1");
regfree(®exbuf);
ast_channel_release(chan);
return AST_TEST_FAIL;
}
-
+
AST_LIST_INSERT_HEAD(ast_channel_varshead(chan), var, entries);
if (test_strings[i][3]) {
/*! \file
*
* SYSINFO function to return various system data.
- *
+ *
* \note Inspiration and Guidance from Russell
*
* \author Jeff Peeler
ast_log(LOG_ERROR, "Unknown sysinfo parameter type '%s'.\n", data);
return -1;
}
-
+
return 0;
}
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "System information related functions");
-
*
* \brief Channel timeout related dialplan functions
*
- * \author Mark Spencer <markster@digium.com>
+ * \author Mark Spencer <markster@digium.com>
* \ingroup functions
*/
<syntax>
<parameter name="timeouttype" required="true">
<para>The timeout that will be manipulated. The possible timeout types
- are: <literal>absolute</literal>, <literal>digit</literal> or
+ are: <literal>absolute</literal>, <literal>digit</literal> or
<literal>response</literal></para>
</parameter>
</syntax>
*
* Copyright (C) 1999 - 2006, Digium, Inc.
*
- * Created by Olle E. Johansson, Edvina.net
+ * Created by Olle E. Johansson, Edvina.net
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* \brief URI encoding / decoding
*
* \author Olle E. Johansson <oej@edvina.net>
- *
+ *
* \note For now this code only supports 8 bit characters, not unicode,
which we ultimately will need to support.
- *
+ *
* \ingroup functions
*/
/*! \file
*
* \brief Return the current Version strings
- *
+ *
* \author Steve Murphy (murf@digium.com)
* \ingroup functions
*/
* Asterisk -- An open source telephony toolkit.
*
* Copyright (c) 2006 Tilghman Lesher. All rights reserved.
- *
+ *
* Tilghman Lesher <asterisk-vmcount-func@the-tilghman.com>
*
* See http://www.asterisk.org for more information about
</parameter>
</syntax>
<description>
- <para>Count the number of voicemails in a specified mailbox, you could also specify
+ <para>Count the number of voicemails in a specified mailbox, you could also specify
the mailbox <replaceable>folder</replaceable>.</para>
<para>Example: <literal>exten => s,1,Set(foo=${VMCOUNT(125@default)})</literal></para>
</description>
}
snprintf(buf, len, "%d", ast_app_messagecount(args.vmbox, args.folder));
-
+
return 0;
}
*
* Copyright (C) 2011, Digium, Inc.
*
- * Joshua Colp <jcolp@digium.com>
+ * Joshua Colp <jcolp@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
*
* \brief Technology independent volume control
*
- * \author Joshua Colp <jcolp@digium.com>
+ * \author Joshua Colp <jcolp@digium.com>
*
* \ingroup functions
*
if (frame->frametype == AST_FRAME_DTMF) {
/* Only use DTMF coming from the source... not going to it */
if (direction != AST_AUDIOHOOK_DIRECTION_READ)
- return 0;
+ return 0;
if (frame->subclass.integer == '*') {
vi->tx_gain += 1;
vi->rx_gain += 1;
}
}
-
+
if (frame->frametype == AST_FRAME_VOICE) {
/* Based on direction of frame grab the gain, and confirm it is applicable */
if (!(gain = (direction == AST_AUDIOHOOK_DIRECTION_READ) ? &vi->rx_gain : &vi->tx_gain) || !*gain)
return -1;
}
- if (!strcasecmp(args.direction, "tx")) {
- vi->tx_gain = atoi(value);
+ if (!strcasecmp(args.direction, "tx")) {
+ vi->tx_gain = atoi(value);
} else if (!strcasecmp(args.direction, "rx")) {
vi->rx_gain = atoi(value);
} else {
}
/* Add Option data to struct */
-
+
if (!ast_strlen_zero(args.options)) {
struct ast_flags flags = { 0 };
ast_app_parse_options(volume_opts, &flags, NULL, args.options);
vi->flags = flags.flags;
- } else {
- vi->flags = 0;
+ } else {
+ vi->flags = 0;
}
return 0;
/*! \file
*
* \brief Common implementation-independent jitterbuffer stuff.
- *
+ *
* \author Slav Klenov <slav@securax.org>
*/
void ast_adsi_install_funcs(const struct adsi_funcs *funcs);
#endif /* _ASTERISK_ADSI_H */
-
void ael2_print(char *fname, pval *tree);
struct pval *ael2_parse(char *fname, int *errs); /* in ael.flex */
void destroy_pval(pval *item);
-
+
extern char *prev_word; /* in ael.flex */
#ifndef YY_TYPEDEF_YY_SCANNER_T
};
/* for CODE GENERATION */
-
+
typedef enum { AEL_APPCALL, AEL_CONTROL1, AEL_FOR_CONTROL, AEL_IF_CONTROL, AEL_IFTIME_CONTROL, AEL_RAND_CONTROL, AEL_LABEL, AEL_RETURN } ael_priority_type;
{
int priority_num;
ael_priority_type type;
-
+
char *app;
char *appargs;
-
+
struct pval *origin;
struct ael_extension *exten;
-
+
struct ael_priority *goto_true;
struct ael_priority *goto_false;
struct ael_priority *next;
int is_switch;
int has_switch; /* set if a switch exists in the extension */
int checked_switch; /* set if we checked for a switch in the extension -- so we don't have to do it again */
-
+
struct ast_context *context;
-
+
struct ael_priority *plist;
struct ael_priority *plist_last;
struct ael_extension *next_exten;
typedef struct agi_command {
const char * const cmda[AST_MAX_CMD_LEN]; /*!< Null terminated list of the words of the command */
- /*! Handler for the command (channel, AGI state, # of arguments, argument list).
+ /*! Handler for the command (channel, AGI state, # of arguments, argument list).
Returns RESULT_SHOWUSAGE for improper arguments */
int (* const handler)(struct ast_channel *chan, AGI *agi, int argc, const char * const argv[]);
/*! Summary of the command (< 60 characters) */
*/
/*! \file
- *
- * ???????
+ *
+ * ???????
* \todo Explain this file!
*/
* found_obj = ASTOBJ_CONTAINER_FIND(&super_container, "obj1");
*
* if(found_obj) {
- * printf("Found object: %s", found_obj->name);
+ * printf("Found object: %s", found_obj->name);
* ASTOBJ_UNREF(found_obj,sample_object_destroy);
* }
*
* ASTOBJ_CONTAINER_DESTROYALL(&super_container,sample_object_destroy);
* ASTOBJ_CONTAINER_DESTROY(&super_container);
- *
+ *
* return 0;
* }
* \endcode
/*! \brief Unlock a locked object. */
#define ASTOBJ_UNLOCK(object) ast_mutex_unlock(&(object)->_lock)
-#ifdef ASTOBJ_CONTAINER_HASHMODEL
+#ifdef ASTOBJ_CONTAINER_HASHMODEL
#define __ASTOBJ_HASH(type,hashes) \
- type *next[hashes]
-#else
+ type *next[hashes]
+#else
#define __ASTOBJ_HASH(type,hashes) \
- type *next[1]
-#endif
+ type *next[1]
+#endif
/*! \brief Add ASTOBJ components to a struct (without locking support).
*
unsigned int refcount; \
unsigned int objflags; \
__ASTOBJ_HASH(type,hashes)
-
+
/*! \brief Add ASTOBJ components to a struct (without locking support).
*
* \param type The datatype of the object.
*
* This macro works like #ASTOBJ_COMPONENTS_NOLOCK_FULL() except it only accepts a
* type and uses default values for namelen and hashes.
- *
+ *
* <b>Sample Usage:</b>
* \code
* struct sample_struct_componets {
*/
#define ASTOBJ_COMPONENTS(type) \
ASTOBJ_COMPONENTS_NOLOCK(type); \
- ast_mutex_t _lock;
-
+ ast_mutex_t _lock;
+
/*! \brief Add ASTOBJ components to a struct (with locking support).
*
* \param type The datatype of the object.
*/
#define ASTOBJ_COMPONENTS_FULL(type,namelen,hashes) \
ASTOBJ_COMPONENTS_NOLOCK_FULL(type,namelen,hashes); \
- ast_mutex_t _lock;
+ ast_mutex_t _lock;
/*! \brief Increment an object reference count.
* \param object A pointer to the object to operate on.
ASTOBJ_UNLOCK(object); \
(object); \
})
-
+
/*! \brief Decrement the reference count on an object.
*
* \param object A pointer the object to operate on.
(object) = NULL; \
} while(0)
-/*! \brief Mark an ASTOBJ by adding the #ASTOBJ_FLAG_MARKED flag to its objflags mask.
+/*! \brief Mark an ASTOBJ by adding the #ASTOBJ_FLAG_MARKED flag to its objflags mask.
* \param object A pointer to the object to operate on.
*
* This macro "marks" an object. Marked objects can later be unlinked from a container using
* #ASTOBJ_CONTAINER_PRUNE_MARKED().
- *
+ *
*/
#define ASTOBJ_MARK(object) \
do { \
(object)->objflags |= ASTOBJ_FLAG_MARKED; \
ASTOBJ_UNLOCK(object); \
} while(0)
-
+
/*! \brief Unmark an ASTOBJ by subtracting the #ASTOBJ_FLAG_MARKED flag from its objflags mask.
* \param object A pointer to the object to operate on.
*/
*/
#define ASTOBJ_CONTAINER_RDLOCK(container) ast_mutex_lock(&(container)->_lock)
-/*! \brief Lock an ASTOBJ_CONTAINER for writing.
+/*! \brief Lock an ASTOBJ_CONTAINER for writing.
*/
#define ASTOBJ_CONTAINER_WRLOCK(container) ast_mutex_lock(&(container)->_lock)
*
* This macro initializes a container. It should only be used on containers
* that support locking.
- *
+ *
* <b>Sample Usage:</b>
* \code
* struct sample_struct_container {
do { \
ast_mutex_init(&(container)->_lock); \
} while(0)
-
+
/*! \brief Destroy a container.
*
* \param container A pointer to the container to destroy.
})
/*! \brief Find an object in a container.
- *
+ *
* \param container A pointer to the container to search.
* \param data The data to search for.
* \param field The field/member of the container's objects to search.
*
* This macro iterates through a container passing the specified field and data
* elements to the specified comparefunc. The function should return 0 when a match is found.
- *
+ *
* \note When the returned object is no longer in use, #ASTOBJ_UNREF() should
* be used to free the additional reference created by this macro.
*
})
/*! \brief Find and remove an object from a container.
- *
+ *
* \param container A pointer to the container to operate on.
* \param namestr The name of the object to remove.
*
})
/*! \brief Find and remove an object in a container.
- *
+ *
* \param container A pointer to the container to search.
* \param data The data to search for.
* \param field The field/member of the container's objects to search.
*
* This macro iterates through a container passing the specified field and data
* elements to the specified comparefunc. The function should return 0 when a match is found.
- * If a match is found it is removed from the list.
+ * If a match is found it is removed from the list.
*
* \note This macro does not destroy any objects, it simply unlinks
* them. No destructors are called.
*
* \param container A pointer to the container to prune.
* \param destructor A destructor function to call on each marked object.
- *
+ *
* This macro iterates through the specfied container and prunes any marked
* objects executing the specfied destructor if necessary.
*/
*
* This macro initializes a container. It should only be used on containers
* that support locking.
- *
+ *
* <b>Sample Usage:</b>
* \code
* struct sample_struct_container {
* at the top of the source tree.
*/
-/*!
+/*!
* \file
* \brief Open Settlement Protocol (OSP)
*/
ast_mutex_t lock;
};
-/*!
+/*!
* \par Just what the $!@# is an autochan?
*
* An ast_autochan is a structure which contains an ast_channel. The pointer
*/
void ast_calendar_merge_events(struct ast_calendar *cal, struct ao2_container *new_events);
-/*! \brief Unreference an ast_calendar_event
+/*! \brief Unreference an ast_calendar_event
*
* \param event event to unref
*
*/
struct ast_calendar_event *ast_calendar_unref_event(struct ast_calendar_event *event);
-/*! \brief Remove all events from calendar
+/*! \brief Remove all events from calendar
*
* \param cal calendar whose events need to be cleared
*/
* ready, and then based on set flags, creates the proper frame type. For chan_dahdi, we
* provide this function. It provides us the data we need, and we'll make its frame for it.
*
- * \param chan A channel involved in the call. What we want is on a datastore on both incoming
+ * \param chan A channel involved in the call. What we want is on a datastore on both incoming
* and outgoing so either may be provided
* \param cc_params The CC configuration parameters for the outbound target
* \param monitor_type The type of monitor to use when CC is requested
* data has been allocated, then this parameter should contain a pointer to that data. If using a generic
* monitor, this parameter should remain NULL. Note that if this function should fail at some point,
* it is the responsibility of the caller to free the private data upon return.
- * \param[out] frame The frame we will be returning to the caller. It is vital that ast_frame_free be
+ * \param[out] frame The frame we will be returning to the caller. It is vital that ast_frame_free be
* called on this frame since the payload will be allocated on the heap.
* \retval -1 Failure. At some point there was a failure. Do not attempt to use the frame in this case.
* \retval 0 Success
* at the top of the source tree.
*/
-/*!
+/*!
* \file
- * \brief Call Event Logging API
+ * \brief Call Event Logging API
*
* \todo TODO: There some event types that have been defined here, but are not
* yet used anywhere in the code. It would be really awesome if someone
char *new_setdebug(const struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
...
- // this is how we create the entry to register
+ // this is how we create the entry to register
AST_CLI_DEFINE(new_setdebug, "short description")
...
return NULL;
return ast_cli_complete(a->word, choices, a->n);
- default:
+ default:
// we are guaranteed to be called with argc >= e->args;
if (a->argc > e->args + 1) // we accept one extra argument
return CLI_SHOWUSAGE;
}
\endcode
-
+
*/
-/*! \brief calling arguments for new-style handlers.
+/*! \brief calling arguments for new-style handlers.
* \arg \ref CLI_command_API
*/
enum ast_cli_command {
const int n; /* the iteration count (n-th entry we generate) */
};
-/*! \brief descriptor for a cli entry.
+/*! \brief descriptor for a cli entry.
* \arg \ref CLI_command_API
*/
struct ast_cli_entry {
*/
char *ast_cli_complete(const char *word, const char * const choices[], int pos);
-/*!
+/*!
* \brief Interprets a command
* Interpret a command s, sending output to fd if uid:gid has permissions
* to run this command. uid = CLI_NO_PERMS to avoid checking user permissions
*/
int ast_cli_command_full(int uid, int gid, int fd, const char *s);
-#define ast_cli_command(fd,s) ast_cli_command_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, s)
+#define ast_cli_command(fd,s) ast_cli_command_full(CLI_NO_PERMS, CLI_NO_PERMS, fd, s)
-/*!
+/*!
* \brief Executes multiple CLI commands
* Interpret strings separated by NULL and execute each one, sending output to fd
* if uid has permissions, uid = CLI_NO_PERMS to avoid checking users permissions.
*/
int ast_cli_register_multiple(struct ast_cli_entry *e, int len);
-/*!
+/*!
* \brief Unregisters a command or an array of commands
* \param e which cli entry to unregister
* Unregister your own command. You must pass a completed ast_cli_entry structure
*/
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len);
-/*!
+/*!
* \brief Readline madness
* Useful for readline, that's about it
* \retval 0 on success
/*
* Asterisk -- An open source telephony toolkit.
- *
+ *
* Copyright (C) 1999-2006, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
typedef unsigned long long uint64_t;
#endif
-/* glob compat stuff */
+/* glob compat stuff */
#if defined(__Darwin__) || defined(__CYGWIN__)
#define GLOB_ABORTED GLOB_ABEND
#endif
/*!
* \brief Inserts new category
- *
+ *
* \param config which config to use
* \param cat newly created category to insert
* \param match which category to insert above
* VA_NARGS(one, two, three) -> v
* VA_NARGS1(one, two, three, 8, 7, 6, 5, 4, 3, 2, 1, 0) ->
* VA_NARGS1( _1, _2, _3, _4, _5, _6, _7, _8, N, ... ) N -> 3
- *
+ *
* Note that VA_NARGS *does not* work when there are no arguments passed. Pasting an empty
* __VA_ARGS__ with a comma like ", ##__VA_ARGS__" will delete the leading comma, but it
* does not work when __VA_ARGS__ is the first argument. Instead, 1 is returned instead of 0:
- *
+ *
* VA_NARGS() -> v
* VA_NARGS1( , 8, 7, 6, 5, 4, 3, 2, 1, 0) ->
* VA_NARGS1(_1, _2, _3, _4, _5, _6, _7, _8, N) -> 1
*/
struct ast_channel *ast_unreal_new_channels(struct ast_unreal_pvt *p,
const struct ast_channel_tech *tech, int semi1_state, int semi2_state,
- const char *exten, const char *context, const struct ast_assigned_ids *assignedids,
+ const char *exten, const char *context, const struct ast_assigned_ids *assignedids,
const struct ast_channel *requestor, struct ast_callid *callid);
/*!
<hr>
Return to the \ref ArchTOC
*/
-
* \arg <b>Website</b>: http://www.openssl.org
* \arg <b>Used by</b>: Asterisk core (TLS for manager and HTTP), res_crypto
* \arg <b>License</b>: Apache 2.0
- * \arg <b>Note</b>: An exception has been granted to allow linking of
+ * \arg <b>Note</b>: An exception has been granted to allow linking of
* OpenSSL with Asterisk.
*
* \subsection curl_lib Curl
* at the top of the source tree.
*/
-/*!
+/*!
* \file
*
* This is the main header file used for generating miscellaneous documentation
- * using Doxygen. This also utilizes the documentation in
+ * using Doxygen. This also utilizes the documentation in
* include/asterisk/doxygen/ header files.
*/
-/*
+/*
* The following is for Doxygen Developer's documentation generated
* by running "make progdocs" with doxygen installed on your
* system.
*/
-/*!
+/*!
* \page DevDoc Asterisk Developer's Documentation - Appendices
*
* \section devpolicy Development and Release Policies
*
* \section debugconfig Debugging and Configuration References
* \arg \ref AstDebug : Hints on debugging
- * \arg \ref extref
+ * \arg \ref extref
* \arg \ref ConfigFiles
* \arg \ref SoundFiles included in the Asterisk distribution
*
* \arg \b Digium: The Asterisk Company https://www.digium.com
*/
-/*!
+/*!
* \page CodeGuide Coding Guidelines
* \AsteriskTrunkWarning
* \section Coding Guidelines
* \verbinclude CODING-GUIDELINES
*/
-/*!
+/*!
* \page AstAPI Asterisk API
* \section Asteriskapi Asterisk API
* Some generic documents on the Asterisk architecture
* \arg See \ref Def_Channel
*/
-/*!
+/*!
* \page AstAPIChanges Asterisk API Changes
*
* \section Changes161 Version 1.6.1
* \li ast_channel_alloc()
*/
-/*!
+/*!
* \page AstAMI AMI - The Manager Interface
* \section ami AMI - The manager Interface
* \arg \link Config_ami Configuration file \endlink
/*!
* \page AstARA ARA - The Asterisk Realtime Interface
* \section realtime ARA - a generic API to storage and retrieval
- * Implemented in \ref config.c
- * Implemented in \ref pbx_realtime.c
+ * Implemented in \ref config.c
+ * Implemented in \ref pbx_realtime.c
* \todo include missing realtime txt
* \todo include missing extconfig txt
*/
-/*!
+/*!
* \page AstDUNDi DUNDi
*
- * DUNDi is a peer-to-peer system for locating Internet gateways to telephony
- * services. Unlike traditional centralized services (such as the remarkably
- * simple and concise ENUM standard), DUNDi is fully-distributed with no
+ * DUNDi is a peer-to-peer system for locating Internet gateways to telephony
+ * services. Unlike traditional centralized services (such as the remarkably
+ * simple and concise ENUM standard), DUNDi is fully-distributed with no
* centralized authority whatsoever.
*
- * DUNDi is not itself a Voice-over IP signaling or media protocol. Instead,
- * it publishes routes which are in turn accessed via industry standard
- * protocols such as IAX, SIP and H.323.
+ * DUNDi is not itself a Voice-over IP signaling or media protocol. Instead,
+ * it publishes routes which are in turn accessed via industry standard
+ * protocols such as IAX, SIP and H.323.
*
* \par References
* \arg DUNDi is documented at http://www.dundi.com
* \arg Configuration in \ref dundi.conf
*/
-/*!
+/*!
* \page AstCDR CDR - Call Data Records and billing
* \section cdr Call Data Records
* \par See also
* \todo include missing cdrdriver txt
*/
-/*!
+/*!
* \page AstCREDITS CREDITS
* \verbinclude CREDITS
*/
-/*!
+/*!
* \page AstVideo Video support in Asterisk
* \section sectAstVideo Video support in Asterisk
* \todo include missing video txt
*/
-/*!
+/*!
* \page AstVar Globally predefined channel variables
* \section globchan Globally predefined channel variables
*
*
*/
-/*!
+/*!
* \page AstChanVar Asterisk Dialplan Variables
* Asterisk Dialplan variables are divided into three groups:
* - Predefined global variables, handled by the PBX core
* Channel variables are only reachable within the channel.
*
* For more information on the predefined variables, see \ref AstVar
- *
+ *
* Global and Channel variables:
* - Names are Case insensitive
* - Names that start with a character, but are alphanumeric
* Global variables can also be set in the [globals] section of extensions.conf. The
* setting \b clearglobalvars in extensions.conf [general] section affects whether
* or not the global variables defined in \b globals are reset at dialplan reload.
- *
+ *
* There are CLI commands to change and read global variables. This can be handy
* to reset counters at midnight from an external script.
*
* with the list starting at varshead in struct ast_channel
*/
-/*!
+/*!
* \page Config_mod Modules configuration
* All res_ resource modules are loaded with globals on, which means
* that non-static functions are callable from other modules.
/*!
* \page Config_ext Extensions.conf - the Dial Plan
- * \section dialplan Extensions.conf
+ * \section dialplan Extensions.conf
* \verbinclude extensions.conf.sample
*/
-/*!
+/*!
* \page Config_rtp RTP configuration
* \arg Implemented in \ref rtp.c
* Used in \ref chan_sip.c and \ref chan_mgcp.c (and various H.323 channels)
* \verbinclude rtp.conf.sample
*/
-/*!
+/*!
* \page Config_codec CODEC Configuration
* \section codecsconf codecs.conf
* \verbinclude codecs.conf.sample
*/
-/*!
+/*!
* \page Config_ara REALTIME Configuration
* \arg See also: \arg \link AstARA \endlink
* \section extconf extconfig.conf
* \verbinclude extconfig.conf.sample
*/
-/*!
+/*!
* \page Config_ami AMI configuration
* \arg See also: \arg \link AstAMI \endlink
* \section amiconf manager.conf
* \verbinclude manager.conf.sample
*/
-/*!
+/*!
* \page SoundFiles Sound files
* \section SecSound Asterisk Sound files
* Asterisk includes a large number of sound files. Many of these
/*! \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \addtogroup cdr_drivers Module: CDR Drivers
* \section CDR_generic Asterisk CDR Drivers
- * \brief CDR drivers are loaded dynamically, each loaded CDR driver produce
+ * \brief CDR drivers are loaded dynamically, each loaded CDR driver produce
* a billing record for each call.
* \arg \ref Config_mod "Modules Configuration"
* \arg \ref Config_cdr "CDR Configuration"
*/
-/*!
+/*!
* \addtogroup channel_drivers Module: Asterisk Channel Drivers
* \section channel_generic Asterisk Channel Drivers
- * \brief Channel drivers are loaded dynamically.
+ * \brief Channel drivers are loaded dynamically.
* \arg \ref Config_mod "Modules Configuration"
*/
-/*!
+/*!
* \addtogroup applications Dial plan applications
* \section app_generic Asterisk Dial Plan Applications
- * \brief Applications support the dialplan. They register dynamically with
- * \see ast_register_application() and unregister with
+ * \brief Applications support the dialplan. They register dynamically with
+ * \see ast_register_application() and unregister with
* \see ast_unregister_application()
* \par See also
* \arg \ref functions
*/
-/*!
+/*!
* \addtogroup functions Module: Dial plan functions
* \section func_generic Asterisk Dial Plan Functions
* \brief Functions support the dialplan. They do not change any property of a channel
* or touch a channel in any way.
* \par See also
* \arg \ref applications
- *
+ *
*/
-/*!
+/*!
* \addtogroup codecs Module: Codecs
* \section codec_generic Asterisk Codec Modules
- * Codecs are referenced in configuration files by name
- * \par See also
- * \arg \ref formats
+ * Codecs are referenced in configuration files by name
+ * \par See also
+ * \arg \ref formats
*/
-/*!
- * \addtogroup formats Module: Media File Formats
+/*!
+ * \addtogroup formats Module: Media File Formats
* \section codec_generic Asterisk Format drivers
* Formats are modules that read or write media files to disk.
* \par See also
- * \arg \ref codecs
+ * \arg \ref codecs
*/
-/*!
+/*!
* \addtogroup rtp_engines Module: RTP Engines
* \section rtp_engine_blah Asterisk RTP Engines
*/
* See also \arg \ref AstDUNDi
*/
-#ifndef _ASTERISK_DUNDI_H
+#ifndef _ASTERISK_DUNDI_H
#define _ASTERISK_DUNDI_H
#include "asterisk/channel.h"
DUNDI_CAUSE_BADENCRYPT = 7,
};
-struct dundi_cause {
+struct dundi_cause {
unsigned char causecode; /*!< Numerical cause (DUNDI_CAUSE_*) */
char desc[0]; /*!< Textual description */
} __attribute__((__packed__));
char org[80];
char orgunit[80];
char email[80];
- char phone[80];
+ char phone[80];
char ipaddr[80];
};
-/*!
+/*!
* \brief Lookup the given number in the given dundi context.
- * Lookup number in a given dundi context (if unspecified use e164), the given callerid (if specified)
+ * Lookup number in a given dundi context (if unspecified use e164), the given callerid (if specified)
* and return up to maxret results in the array specified.
* \retval the number of results found.
- * \retval -1 on a hangup of the channel.
+ * \retval -1 on a hangup of the channel.
*/
int dundi_lookup(struct dundi_result *result, int maxret, struct ast_channel *chan, const char *dcontext, const char *number, int nocache);
#endif /* __BYTE_ORDER */
#endif /* _ASTERISK_ENDIAN_H */
-
AST_EVENT_IE_OLDMSGS = 0x0002,
/*!
* \brief Mailbox name \verbatim (mailbox[@context]) \endverbatim
- * Used by: AST_EVENT_MWI
+ * Used by: AST_EVENT_MWI
* Payload type: STR
*/
AST_EVENT_IE_MAILBOX = 0x0003,
*/
int ast_stopstream(struct ast_channel *c);
-/*!
- * \brief Checks for the existence of a given file
+/*!
+ * \brief Checks for the existence of a given file
* \param filename name of the file you wish to check, minus the extension
* \param fmt the format you wish to check (the extension)
* \param preflang (the preferred language you wisht to find the file in)
*/
int ast_fileexists(const char *filename, const char *fmt, const char *preflang);
-/*!
- * \brief Renames a file
+/*!
+ * \brief Renames a file
* \param oldname the name of the file you wish to act upon (minus the extension)
* \param newname the name you wish to rename the file to (minus the extension)
* \param fmt the format of the file
- * Rename a given file in a given format, or if fmt is NULL, then do so for all
+ * Rename a given file in a given format, or if fmt is NULL, then do so for all
* \return -1 on failure
*/
int ast_filerename(const char *oldname, const char *newname, const char *fmt);
* \brief Deletes a file
* \param filename name of the file you wish to delete (minus the extension)
* \param fmt of the file
- * Delete a given file in a given format, or if fmt is NULL, then do so for all
+ * Delete a given file in a given format, or if fmt is NULL, then do so for all
*/
int ast_filedelete(const char *filename, const char *fmt);
-/*!
- * \brief Copies a file
+/*!
+ * \brief Copies a file
* \param oldname name of the file you wish to copy (minus extension)
* \param newname name you wish the file to be copied to (minus extension)
* \param fmt the format of the file
- * Copy a given file in a given format, or if fmt is NULL, then do so for all
+ * Copy a given file in a given format, or if fmt is NULL, then do so for all
*/
int ast_filecopy(const char *oldname, const char *newname, const char *fmt);
ast_waitstream_fr_cb cb);
/*!
- * Same as waitstream, but with audio output to fd and monitored fd checking.
+ * Same as waitstream, but with audio output to fd and monitored fd checking.
*
- * \return 1 if monfd is ready for reading
+ * \return 1 if monfd is ready for reading
*/
int ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd, int monfd);
-/*!
+/*!
* \brief Starts reading from a file
* \param filename the name of the file to read from
* \param type format of file you wish to read from
* \param flags file flags
* \param check (unimplemented, hence negligible)
* \param mode Open mode
- * Open an incoming file stream. flags are flags for the open() command, and
- * if check is non-zero, then it will not read a file if there are any files that
+ * Open an incoming file stream. flags are flags for the open() command, and
+ * if check is non-zero, then it will not read a file if there are any files that
* start with that name and have an extension
* Please note, this is a blocking function. Program execution will not return until ast_waitstream completes it's execution.
* \retval a struct ast_filestream on success.
*/
struct ast_filestream *ast_readfile(const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode);
-/*!
- * \brief Starts writing a file
+/*!
+ * \brief Starts writing a file
* \param filename the name of the file to write to
* \param type format of file you wish to write out to
* \param comment comment to go with
* \param flags output file flags
* \param check (unimplemented, hence negligible)
* \param mode Open mode
- * Create an outgoing file stream. oflags are flags for the open() command, and
- * if check is non-zero, then it will not write a file if there are any files that
+ * Create an outgoing file stream. oflags are flags for the open() command, and
+ * if check is non-zero, then it will not write a file if there are any files that
* start with that name and have an extension
* Please note, this is a blocking function. Program execution will not return until ast_waitstream completes it's execution.
* \retval a struct ast_filestream on success.
*/
struct ast_filestream *ast_writefile(const char *filename, const char *type, const char *comment, int flags, int check, mode_t mode);
-/*!
- * \brief Writes a frame to a stream
+/*!
+ * \brief Writes a frame to a stream
* \param fs filestream to write to
* \param f frame to write to the filestream
* Send a frame to a filestream -- note: does NOT free the frame, call ast_frfree manually
*/
int ast_writestream(struct ast_filestream *fs, struct ast_frame *f);
-/*!
- * \brief Closes a stream
+/*!
+ * \brief Closes a stream
* \param f filestream to close
* Close a playback or recording stream
* \retval 0 on success.
*/
int ast_closestream(struct ast_filestream *f);
-/*!
- * \brief Opens stream for use in seeking, playing
+/*!
+ * \brief Opens stream for use in seeking, playing
* \param chan channel to work with
* \param filename to use
* \param preflang prefered language to use
*/
struct ast_filestream *ast_openstream(struct ast_channel *chan, const char *filename, const char *preflang);
-/*!
- * \brief Opens stream for use in seeking, playing
+/*!
+ * \brief Opens stream for use in seeking, playing
* \param chan channel to work with
* \param filename to use
* \param preflang prefered language to use
* \retval NULL on error.
*/
struct ast_filestream *ast_openstream_full(struct ast_channel *chan, const char *filename, const char *preflang, int asis);
-/*!
- * \brief Opens stream for use in seeking, playing
+/*!
+ * \brief Opens stream for use in seeking, playing
* \param chan channel to work with
* \param filename to use
* \param preflang prefered language to use
*/
struct ast_filestream *ast_openvstream(struct ast_channel *chan, const char *filename, const char *preflang);
-/*!
- * \brief Applys a open stream to a channel.
+/*!
+ * \brief Applys a open stream to a channel.
* \param chan channel to work
* \param s ast_filestream to apply
* \retval 0 on success.
*/
int ast_applystream(struct ast_channel *chan, struct ast_filestream *s);
-/*!
- * \brief Play a open stream on a channel.
+/*!
+ * \brief Play a open stream on a channel.
* \param s filestream to play
* \retval 0 on success.
* \retval -1 on failure.
*/
int ast_playstream(struct ast_filestream *s);
-/*!
- * \brief Seeks into stream
+/*!
+ * \brief Seeks into stream
* \param fs ast_filestream to perform seek on
* \param sample_offset numbers of samples to seek
- * \param whence SEEK_SET, SEEK_CUR, SEEK_END
+ * \param whence SEEK_SET, SEEK_CUR, SEEK_END
* \retval 0 on success.
* \retval -1 on failure.
*/
int ast_seekstream(struct ast_filestream *fs, off_t sample_offset, int whence);
-/*!
- * \brief Trunc stream at current location
+/*!
+ * \brief Trunc stream at current location
* \param fs filestream to act on
* \retval 0 on success.
* \retval -1 on failure.
*/
int ast_truncstream(struct ast_filestream *fs);
-/*!
- * \brief Fast forward stream ms
+/*!
+ * \brief Fast forward stream ms
* \param fs filestream to act on
* \param ms milliseconds to move
* \retval 0 on success.
*/
int ast_stream_fastforward(struct ast_filestream *fs, off_t ms);
-/*!
- * \brief Rewind stream ms
+/*!
+ * \brief Rewind stream ms
* \param fs filestream to act on
* \param ms milliseconds to move
* \retval 0 on success.
*/
int ast_stream_rewind(struct ast_filestream *fs, off_t ms);
-/*!
- * \brief Tell where we are in a stream
+/*!
+ * \brief Tell where we are in a stream
* \param fs fs to act on
* \return a long as a sample offset into stream
*/
*/
int ast_ratestream(struct ast_filestream *fs);
-/*!
- * \brief Read a frame from a filestream
+/*!
+ * \brief Read a frame from a filestream
* \param s ast_filestream to act on
* \return a frame.
* \retval NULL if read failed.
- */
+ */
struct ast_frame *ast_readframe(struct ast_filestream *s);
/*! Initialize file stuff */
enum ast_format_cmp_res (* const format_cmp)(const struct ast_format *format1,
const struct ast_format *format2);
- /*!
+ /*!
* \brief Get a format with the joint compatible attributes of both provided formats.
*
* \param format1 The first format
* \details Two events are guaranteed to occur once the ast_framehook_attach()
* function is called. These events are AST_FRAMEHOOK_EVENT_ATTACHED, which occurs
* immediately after the framehook is attached to a channel, and
- * AST_FRAMEHOOK_EVENT_DETACHED, which occurs right after the framehook is
+ * AST_FRAMEHOOK_EVENT_DETACHED, which occurs right after the framehook is
* detached.
*
* It is completely valid for the frame variable to be set to NULL. Always do a NULL
/*!
* \brief Detach an framehook from a channel.
* \since 1.8
- *
+ *
* \pre The Channel must be locked during this function call.
* If this function is never called after attaching an framehook,
* the framehook will be detached and destroyed during channel
* \since 1.8
*
* \pre The Channel must be locked during this function call.
- *
+ *
* \param chan channel containing the framehook list to destroy.
* \retval 0 success
* \retval -1 failure
#else
#include "fskmodem_float.h"
#endif
-
int xi0;
int xi1;
int xi2;
-
+
int ispb;
int icont;
int bw; /*!< Band Selector*/
int pllispb; /*!<Pll autosense */
int pllids;
int pllispb2;
-
+
struct filter_struct mark_filter;
struct filter_struct space_filter;
struct filter_struct demod_filter;
AST_LIST_ENTRY(ast_imager) list; /*!< For linked list */
};
-/*!
- * \brief Check for image support on a channel
+/*!
+ * \brief Check for image support on a channel
* \param chan channel to check
* Checks the channel to see if it supports the transmission of images
* \return non-zero if image transmission is supported
*/
int ast_supports_images(struct ast_channel *chan);
-/*!
- * \brief Sends an image
+/*!
+ * \brief Sends an image
* \param chan channel to send image on
* \param filename filename of image to send (minus extension)
* Sends an image on the given channel.
*/
int ast_send_image(struct ast_channel *chan, const char *filename);
-/*!
- * \brief Make an image
+/*!
+ * \brief Make an image
* \param filename filename of image to prepare
* \param preflang preferred language to get the image...?
* \param format the format of the file, NULL for any image format
*/
struct ast_frame *ast_read_image(const char *filename, const char *preflang, struct ast_format *format);
-/*!
+/*!
* \brief Register image format
* \param imgdrv Populated ast_imager structure with info to register
* Registers an image format
*/
int ast_image_register(struct ast_imager *imgdrv);
-/*!
- * \brief Unregister an image format
+/*!
+ * \brief Unregister an image format
* \param imgdrv pointer to the ast_imager structure you wish to unregister
* Unregisters the image format passed in.
* Returns nothing
*/
void ast_image_unregister(struct ast_imager *imgdrv);
-/*!
+/*!
* \brief Initialize image stuff
* Initializes all the various image stuff. Basically just registers the cli stuff
* \return 0 all the time
struct ast_tone_zone {
/*! \brief Country code that this set of tones is for */
char country[MAX_TONEZONE_COUNTRY];
- /*!
+ /*!
* \brief Text description of the given country.
*
* This is for nothing more than friendly display to a human.
char description[40];
/*! \brief Number of ring cadence elements in the ringcadence array */
unsigned int nrringcadence;
- /*!
+ /*!
* \brief Array of ring cadence parts
*
* Each element is an amount of time in milliseconds. The first element
struct io_context;
-/*!
- * \brief Creates a context
+/*!
+ * \brief Creates a context
* Create a context for I/O operations
* Basically mallocs an IO structure and sets up some default values.
* \return an allocated io_context structure
*/
struct io_context *io_context_create(void);
-/*!
- * \brief Destroys a context
+/*!
+ * \brief Destroys a context
* \param ioc structure to destroy
* Destroy a context for I/O operations
* Frees all memory associated with the given io_context structure along with the structure itself
typedef int (*ast_io_cb)(int *id, int fd, short events, void *cbdata);
#define AST_IO_CB(a) ((ast_io_cb)(a))
-/*!
- * \brief Adds an IO context
+/*!
+ * \brief Adds an IO context
* \param ioc which context to use
* \param fd which fd to monitor
* \param callback callback function to run
* \param events event mask of events to wait for
* \param data data to pass to the callback
* Watch for any of revents activites on fd, calling callback with data as
- * callback data.
+ * callback data.
* \retval a pointer to ID of the IO event
* \retval NULL on failure
*/
int *ast_io_add(struct io_context *ioc, int fd, ast_io_cb callback, short events, void *data);
-/*!
- * \brief Changes an IO handler
+/*!
+ * \brief Changes an IO handler
* \param ioc which context to use
* \param id
* \param fd the fd you wish it to contain now
* \param callback new callback function
* \param events event mask to wait for
* \param data data to pass to the callback function
- * Change an I/O handler, updating fd if > -1, callback if non-null,
+ * Change an I/O handler, updating fd if > -1, callback if non-null,
* and revents if >-1, and data if non-null.
* \retval a pointer to the ID of the IO event
* \retval NULL on failure
*/
int *ast_io_change(struct io_context *ioc, int *id, int fd, ast_io_cb callback, short events, void *data);
-/*!
- * \brief Removes an IO context
+/*!
+ * \brief Removes an IO context
* \param ioc which io_context to remove it from
* \param id which ID to remove
- * Remove an I/O id from consideration
+ * Remove an I/O id from consideration
* \retval 0 on success
* \retval -1 on failure
*/
int ast_io_remove(struct io_context *ioc, int *id);
-/*!
- * \brief Waits for IO
+/*!
+ * \brief Waits for IO
* \param ioc which context to act upon
* \param howlong how many milliseconds to wait
* Wait for I/O to happen, returning after
* howlong milliseconds, and after processing
- * any necessary I/O.
+ * any necessary I/O.
* \return he number of I/O events which took place.
*/
int ast_io_wait(struct io_context *ioc, int howlong);
-/*!
+/*!
* \brief Dumps the IO array.
* Debugging: Dump everything in the I/O array
*/
int ast_hide_password(int fd);
-/*!
+/*!
* \brief Restores TTY mode.
* Call with result from previous ast_hide_password
*/
/*! \brief Check if AMI/HTTP is enabled */
int check_webmanager_enabled(void);
-/*! Add a custom hook to be called when an event is fired
+/*! Add a custom hook to be called when an event is fired
\param hook struct manager_custom_hook object to add
*/
void ast_manager_register_hook(struct manager_custom_hook *hook);
unsigned int registered:1;
};
-/*! \brief External routines may register/unregister manager callbacks this way
+/*! \brief External routines may register/unregister manager callbacks this way
* \note Use ast_manager_register2() to register with help text for new manager commands */
#define ast_manager_register(action, authority, func, synopsis) ast_manager_register2(action, authority, func, ast_module_info->self, synopsis, NULL)
*/
int ast_manager_unregister(const char *action);
-/*!
- * \brief Verify a session's read permissions against a permission mask.
+/*!
+ * \brief Verify a session's read permissions against a permission mask.
* \param ident session identity
* \param perm permission mask to verify
* \retval 1 if the session has the permission mask capabilities
int astman_verify_session_readpermissions(uint32_t ident, int perm);
/*!
- * \brief Verify a session's write permissions against a permission mask.
+ * \brief Verify a session's write permissions against a permission mask.
* \param ident session identity
* \param perm permission mask to verify
* \retval 1 if the session has the permission mask capabilities, otherwise 0
*/
int astman_verify_session_writepermissions(uint32_t ident, int perm);
-/*! \brief External routines may send asterisk manager events this way
+/*! \brief External routines may send asterisk manager events this way
* \param category Event category, matches manager authorization
\param event Event name
\param contents Contents of event
/*! \brief Called by Asterisk module functions and the CLI command */
int reload_manager(void);
-/*!
+/*!
* \brief Add a datastore to a session
*
* \retval 0 success
int astman_datastore_add(struct mansession *s, struct ast_datastore *datastore);
-/*!
+/*!
* \brief Remove a datastore from a session
*
* \retval 0 success
*/
int astman_datastore_remove(struct mansession *s, struct ast_datastore *datastore);
-/*!
+/*!
* \brief Find a datastore on a session
*
* \retval pointer to the datastore if found
/*!
* \brief Get the body of a message.
* \note The return value is valid only as long as the ast_message is valid. Hold a reference
- * to the message if you plan on storing the return value.
+ * to the message if you plan on storing the return value.
*
* \return The body of the messsage, encoded in UTF-8.
*/
*/
struct ast_format_def {
char name[80]; /*!< Name of format */
- char exts[80]; /*!< Extensions (separated by | if more than one)
+ char exts[80]; /*!< Extensions (separated by | if more than one)
* this format can read. First is assumed for writing (e.g. .mp3) */
struct ast_format *format; /*!< Format of frames it uses/provides (one only) */
/*!
* function can be omitted.
*/
int (*open)(struct ast_filestream *s);
- /*!
+ /*!
* \brief Prepare a stream for output, and comment it appropriately if applicable.
- * \return 0 on success, -1 on error.
- * Same as the open, the FILE is already open so the function just needs to
- * prepare any header and other fields, if any.
+ * \return 0 on success, -1 on error.
+ * Same as the open, the FILE is already open so the function just needs to
+ * prepare any header and other fields, if any.
* The function can be omitted if nothing is needed.
*/
int (*rewrite)(struct ast_filestream *s, const char *comment);
char *write_buffer;
};
-/*!
+/*!
* \brief Register a new file format capability.
* Adds a format to Asterisk's format abilities.
* \retval 0 on success
int __ast_format_def_register(const struct ast_format_def *f, struct ast_module *mod);
#define ast_format_def_register(f) __ast_format_def_register(f, ast_module_info->self)
-/*!
- * \brief Unregisters a file format
+/*!
+ * \brief Unregisters a file format
* \param name the name of the format you wish to unregister
* Unregisters a format based on the name of the format.
* \retval 0 on success
AST_MODULE_SUPPORT_DEPRECATED,
};
-/*!
+/*!
* \brief Load a module.
* \param resource_name The name of the module to load.
*
*/
enum ast_module_load_result ast_load_resource(const char *resource_name);
-/*!
+/*!
* \brief Unload a module.
* \param resource_name The name of the module to unload.
* \param ast_module_unload_mode The force flag. This should be set using one of the AST_FORCE flags.
*
* This function unloads a module. It will only unload modules that are not in
- * use (usecount not zero), unless #AST_FORCE_FIRM or #AST_FORCE_HARD is
+ * use (usecount not zero), unless #AST_FORCE_FIRM or #AST_FORCE_HARD is
* specified. Setting #AST_FORCE_FIRM or #AST_FORCE_HARD will unload the
* module regardless of consequences (NOT RECOMMENDED).
*
*/
enum ast_module_reload_result ast_module_reload(const char *name);
-/*!
+/*!
* \brief Notify when usecount has been changed.
*
* This function calulates use counts and notifies anyone trying to keep track
/*!
* \brief Check if module with the name given is loaded
* \param name Module name, like "chan_sip.so"
- * \retval 1 if true
+ * \retval 1 if true
* \retval 0 if false
*/
int ast_module_check(const char *name);
-/*!
+/*!
* \brief Add a procedure to be run when modules have been updated.
* \param updater The function to run when modules have been updated.
*
* This function adds the given function to a linked list of functions to be
- * run when the modules are updated.
+ * run when the modules are updated.
*
- * \retval 0 on success
+ * \retval 0 on success
* \retval -1 on failure.
*/
int ast_loader_register(int (*updater)(void));
-/*!
+/*!
* \brief Remove a procedure to be run when modules are updated.
* \param updater The updater function to unregister.
*
* This removes the given function from the updater list.
- *
+ *
* \retval 0 on success
* \retval -1 on failure.
*/
int ast_loader_unregister(int (*updater)(void));
-/*!
+/*!
* \brief Match modules names for the Asterisk cli.
* \param line Unused by this function, but this should be the line we are
* matching.
- * \param word The partial name to match.
+ * \param word The partial name to match.
* \param pos The position the word we are completing is in.
* \param state The possible match to return.
* \param rpos The position we should be matching. This should be the same as
const char *name; /*!< name of the module for loader reference and CLI commands */
const char *description; /*!< user friendly description of the module. */
- /*!
+ /*!
* This holds the ASTERISK_GPL_KEY, signifiying that you agree to the terms of
* the Asterisk license as stated in the ASTERISK_GPL_KEY. Your module will not
* load if it does not return the EXACT key string.
#endif /* plain C */
-/*!
+/*!
* \brief Register an application.
*
* \param app Short name of the application
* \param execute a function callback to execute the application. It should return
* non-zero if the channel needs to be hung up.
* \param synopsis a short description (one line synopsis) of the application
- * \param description long description with all of the details about the use of
+ * \param description long description with all of the details about the use of
* the application
- *
- * This registers an application with Asterisk's internal application list.
+ *
+ * This registers an application with Asterisk's internal application list.
* \note The individual applications themselves are responsible for registering and unregistering
* and unregistering their own CLI commands.
- *
- * \retval 0 success
+ *
+ * \retval 0 success
* \retval -1 failure.
*/
#define ast_register_application(app, execute, synopsis, description) ast_register_application2(app, execute, synopsis, description, ast_module_info->self)
-/*!
+/*!
* \brief Register an application using XML documentation.
*
* \param app Short name of the application
* \param execute a function callback to execute the application. It should return
* non-zero if the channel needs to be hung up.
- *
- * This registers an application with Asterisk's internal application list.
+ *
+ * This registers an application with Asterisk's internal application list.
* \note The individual applications themselves are responsible for registering and unregistering
* and unregistering their own CLI commands.
- *
- * \retval 0 success
+ *
+ * \retval 0 success
* \retval -1 failure.
*/
#define ast_register_application_xml(app, execute) ast_register_application(app, execute, NULL, NULL)
int ast_register_application2(const char *app, int (*execute)(struct ast_channel *, const char *),
const char *synopsis, const char *description, void *mod);
-/*!
+/*!
* \brief Unregister an application
- *
+ *
* \param app name of the application (does not have to be the same string as the one that was registered)
- *
+ *
* This unregisters an application from Asterisk's internal application list.
- *
- * \retval 0 success
+ *
+ * \retval 0 success
* \retval -1 failure
*/
int ast_unregister_application(const char *app);
*
* Host names are NOT allowed.
*
- * \param[out] addr The resulting ast_sockaddr. This MAY be NULL from
+ * \param[out] addr The resulting ast_sockaddr. This MAY be NULL from
* functions that are performing validity checks only, e.g. ast_parse_arg().
* \param str The string to parse
* \param flags If set to zero, a port MAY be present. If set to
* Asterisk -- An open source telephony toolkit.
*
* Paths to configurable Asterisk directories
- *
+ *
* Copyright (C) 1999-2006, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
struct ast_include;
struct ast_ignorepat;
struct ast_sw;
-
+
enum ast_state_cb_update_reason {
/*! The extension state update is a result of a device state changing on the extension. */
AST_HINT_UPDATE_DEVICE = 1,
/*! \file
*
* \brief PacketCable COPS
- *
+ *
* \author Attila Domjan <attila.domjan.hu@gmail.com>
*/
int ast_presence_state_engine_init(void);
#endif
-
/* whatever includes this, better include asterisk/lock.h and asterisk/hashtab.h */
-typedef enum
+typedef enum
{
PV_WORD, /* an ident, string, name, label, etc. A user-supplied string. */ /* 0 */
PV_MACRO, /* 1 */
int startcol;
int endcol;
char *filename;
-
+
union
{
char *str; /* wow, used almost everywhere! */
char *for_init; /* used in FOR */
} u1;
struct pval *u1_last; /* to build in-order lists -- looks like we only need one */
-
+
union
{
struct pval *arglist; /* used in macro_call, application_call, MACRO def, also attached to PWORD, the 4 timevals for includes */
char *for_test; /* used in FOR */
struct pval *goto_target; /* used in GOTO */
} u2;
-
+
union
{
char *for_inc; /* used in FOR */
struct ael_extension *compiled_label;
struct pval *extend; /* to link extended contexts to the 'original' */
} u3;
-
+
union
{
struct pval *for_statements; /* used in PV_FOR */
int regexten; /* used in EXTENSION */
} u4;
-
- struct pval *next; /* the pval at the end of this ptr will ALWAYS be of the same type as this one!
+
+ struct pval *next; /* the pval at the end of this ptr will ALWAYS be of the same type as this one!
EXCEPT for objects of the different types, that are in the same list, like contexts & macros, etc */
-
+
struct pval *dad; /* the 'container' of this struct instance */
struct pval *prev; /* the opposite of the 'next' pointer */
} ;
#ifndef AAL_ARGCHECK
/* for the time being, short circuit all the AAL related structures
- without permanently removing the code; after/during the AAL
- development, this code can be properly re-instated
+ without permanently removing the code; after/during the AAL
+ development, this code can be properly re-instated
*/
/* null definitions for structs passed down the infrastructure */
unsigned int pages_transferred;
/*! session details flags for options */
union {
- /*! dontuse dummy variable - do not ever use */
+ /*! dontuse dummy variable - do not ever use */
uint32_t dontuse;
struct {
/*! flag to send debug manager events */
/* functions */
-/*!
+/*!
* \brief Executes a prepared statement handle
* \param obj The non-NULL result of odbc_request_obj()
* \param stmt The prepared statement handle
#define ast_odbc_request_obj2(a, b) _ast_odbc_request_obj2(a, b, __FILE__, __PRETTY_FUNCTION__, __LINE__)
#define ast_odbc_request_obj(a, b) _ast_odbc_request_obj(a, b, __FILE__, __PRETTY_FUNCTION__, __LINE__)
-/*!
+/*!
* \brief Releases an ODBC object previously allocated by ast_odbc_request_obj()
* \param obj The ODBC object
*/
void ast_odbc_release_obj(struct odbc_obj *obj);
-/*!
+/*!
* \brief Checks an ODBC object to ensure it is still connected
* \param obj The ODBC object
* \retval 0 if connected
*/
SQLHSTMT ast_odbc_direct_execute(struct odbc_obj *obj, SQLHSTMT (*exec_cb)(struct odbc_obj *obj, void *data), void *data);
-/*!
+/*!
* \brief Prepares, executes, and returns the resulting statement handle.
* \param obj The ODBC object
* \param prepare_cb A function callback, which, when called, should return a statement handle prepared, with any necessary parameters or result columns bound.
* \param data A parameter to be passed to the prepare_cb parameter function, indicating which statement handle is to be prepared.
- * \retval a statement handle
+ * \retval a statement handle
* \retval NULL on error
*/
SQLHSTMT ast_odbc_prepare_and_execute(struct odbc_obj *obj, SQLHSTMT (*prepare_cb)(struct odbc_obj *obj, void *data), void *data);
* This method will always be called from a SIP servant thread.
*/
void (*session_begin)(struct ast_sip_session *session);
- /*!
+ /*!
* \brief Notification that the session has ended
*
* This method may or may not be called from a SIP servant thread. Do
* There is no guarantee that a channel will be present on the session when this is called.
*/
int (*incoming_request)(struct ast_sip_session *session, struct pjsip_rx_data *rdata);
- /*!
+ /*!
* \brief Called on an incoming SIP response
* This method is always called from a SIP servant thread.
*
* This method is always called from a SIP servant thread.
*/
void (*outgoing_request)(struct ast_sip_session *session, struct pjsip_tx_data *tdata);
- /*!
+ /*!
* \brief Called on an outgoing SIP response
* This method is always called from a SIP servant thread.
*/
* Note: The on_request_creation callback may or may not be called in the same
* thread where this function is called. Request creation may need to be delayed
* due to the current INVITE transaction state.
- *
+ *
* \param session The session on which the reinvite will be sent
* \param on_request_creation Callback called when request is created
* \param on_sdp_creation Callback called when SDP is created
extern "C" {
#endif
-/*!
+/*!
* \brief Remove a scheduler entry
*
* This is a loop construct to ensure that
*
* Since macro expansion essentially works like pass-by-name
* parameter passing, this macro will still work correctly even
- * if the id of the task to delete changes. This holds as long as
- * the name of the id which could change is passed to the macro
+ * if the id of the task to delete changes. This holds as long as
+ * the name of the id which could change is passed to the macro
* and not a copy of the value of the id.
*/
#define AST_SCHED_DEL(sched, id) \
*/
int ast_sched_replace_variable(int old_id, struct ast_sched_context *con, int when, ast_sched_cb callback, const void *data, int variable) attribute_warn_unused_result;
-/*!
- * \brief Find a sched structure and return the data field associated with it.
+/*!
+ * \brief Find a sched structure and return the data field associated with it.
*
* \param con scheduling context in which to search fro the matching id
* \param id ID of the scheduled item to find
} while (0)
#endif /* HAVE_VARIABLE_FDSET */
-/*! \brief Waits for activity on a group of channels
+/*! \brief Waits for activity on a group of channels
* \param nfds the maximum number of file descriptors in the sets
* \param rfds file descriptors to check for read availability
* \param wfds file descriptors to check for write availability
* at the top of the source tree.
*/
-/*!
+/*!
* \file
* \brief SMDI support for Asterisk.
* \author Matthew A. Nicholson <mnicholson@digium.com>
*
* The ast_smdi_mwi_message structure contains the parsed out parts of an smdi
* message. Each ast_smdi_interface structure has a message queue consisting
- * ast_smdi_mwi_message structures.
+ * ast_smdi_mwi_message structures.
*/
struct ast_smdi_mwi_message {
char name[SMDI_MESG_NAME_LEN];
*
* The ast_smdi_md_message structure contains the parsed out parts of an smdi
* message. Each ast_smdi_interface structure has a message queue consisting
- * ast_smdi_md_message structures.
+ * ast_smdi_md_message structures.
*/
struct ast_smdi_md_message {
char name[SMDI_MESG_NAME_LEN];
struct timeval timestamp; /* a timestamp for the message */
};
-/*!
+/*!
* \brief SMDI interface structure.
*
* The ast_smdi_interface structure holds information on a serial port that
*/
struct ast_smdi_interface;
-/*!
+/*!
* \brief Get the next SMDI message from the queue.
* \param iface a pointer to the interface to use.
*
(struct ast_smdi_interface *iface, const char *mailbox),
{ return -1; });
-/*!
+/*!
* \brief Unset the MWI indicator for a mailbox.
* \param iface the interface to use.
* \param mailbox the mailbox to use.
/*! Pointer to the engine used by this speech structure */
struct ast_speech_engine *engine;
};
-
+
/* Speech recognition engine structure */
struct ast_speech_engine {
/*! Name of speech engine */
*/
void ast_srv_cleanup(struct srv_context **context);
-/*! \brief Lookup entry in SRV records Returns 1 if found, 0 if not found, -1 on hangup
+/*! \brief Lookup entry in SRV records Returns 1 if found, 0 if not found, -1 on hangup
*
* Only do SRV record lookup if you get a domain without a port. If you get a port #, it's a DNS host name.
*
* \param[out] priority The priority portion of the record
* \param[out] weight The weight portion of the record
*
- * \retval -1 Failed to retrieve information.
+ * \retval -1 Failed to retrieve information.
* Likely due to an out of range record_num
* \retval 0 Success
*/
#endif /* _ASTERISK_STATSD_H */
-
Using this functionality is quite simple. An example structure
with three fields is defined like this:
-
+
\code
struct sample_fields {
int x1;
long x2;
};
\endcode
-
+
When an instance of this structure is allocated (either statically or
dynamically), the fields and the pool of storage for them must be
initialized:
-
+
\code
struct sample_fields *x;
-
+
x = ast_calloc(1, sizeof(*x));
if (x == NULL || ast_string_field_init(x, 252)) {
if (x)
ast_string_field_init(x, 0) will reset fields to the
initial value while keeping the pool allocated.
-
+
Reading the fields is much like using 'const char * const' fields in the
structure: you cannot write to the field or to the memory it points to.
When the structure instance is no longer needed, the fields
and their storage pool must be freed:
-
+
\code
ast_string_field_free_memory(x);
ast_free(x);
if (work) {
work += strlen(work) - 1;
- /* It's tempting to only want to erase after we exit this loop,
+ /* It's tempting to only want to erase after we exit this loop,
but since ast_trim_blanks *could* receive a constant string
(which we presumably wouldn't have to touch), we shouldn't
actually set anything unless we must, and it's easier just
return (char *) str;
}
)
-
+
/*!
\brief Strip leading/trailing whitespace from a string.
\param s The string to be stripped (will be modified).
ast_trim_blanks(s);
}
return s;
-}
+}
)
/*!
char *ast_strsep(char **s, const char sep, uint32_t flags);
/*!
- \brief Strip backslash for "escaped" semicolons,
+ \brief Strip backslash for "escaped" semicolons,
the string to be stripped (will be modified).
\return The stripped string.
*/
/*!
\brief Build a string in a buffer, designed to be called repeatedly
-
+
\note This method is not recommended. New code should use ast_str_*() instead.
This is a wrapper for snprintf, that properly handles the buffer pointer
/*!
\brief Build a string in a buffer, designed to be called repeatedly
-
+
This is a wrapper for snprintf, that properly handles the buffer pointer
and buffer space available.
*/
int attribute_pure ast_true(const char *val);
-/*!
+/*!
* \brief Make sure something is false.
* Determine if a string containing a boolean value is "false".
- * This function checks to see whether a string passed to it is an indication of an "false" value.
- * It checks to see if the string is "no", "false", "n", "f", "off" or "0".
+ * This function checks to see whether a string passed to it is an indication of an "false" value.
+ * It checks to see if the string is "no", "false", "n", "f", "off" or "0".
*
* \retval 0 if val is a NULL pointer.
* \retval -1 if "true".
return buf->__AST_STR_STR;
}
)
-
+
/*
* AST_INLINE_API() is a macro that takes a block of code as an argument.
* Using preprocessor #directives in the argument is not supported by all
{
struct ast_str *old_buf = *buf;
- if (new_len <= (*buf)->__AST_STR_LEN)
+ if (new_len <= (*buf)->__AST_STR_LEN)
return 0; /* success */
if ((*buf)->__AST_STR_TS == DS_ALLOCA || (*buf)->__AST_STR_TS == DS_STATIC)
return -1; /* cannot extend */
{
struct ast_str *old_buf = *buf;
- if (new_len <= (*buf)->__AST_STR_LEN)
+ if (new_len <= (*buf)->__AST_STR_LEN)
return 0; /* success */
if ((*buf)->__AST_STR_TS == DS_ALLOCA || (*buf)->__AST_STR_TS == DS_STATIC)
return -1; /* cannot extend */
* \brief Retrieve a thread locally stored dynamic string
*
* \param ts This is a pointer to the thread storage structure declared by using
- * the AST_THREADSTORAGE macro. If declared with
- * AST_THREADSTORAGE(my_buf, my_buf_init), then this argument would be
+ * the AST_THREADSTORAGE macro. If declared with
+ * AST_THREADSTORAGE(my_buf, my_buf_init), then this argument would be
* (&my_buf).
* \param init_len This is the initial length of the thread's dynamic string. The
* current length may be bigger if previous operations in this thread have
* va_start(fmt, ap);
* ast_str_set_va(&buf, 0, fmt, ap);
* va_end(ap);
- *
+ *
* printf("This is the string we just built: %s\n", buf->str);
* ...
* }
*
* TLS/SSL support is basically implemented by reading from a config file
* (currently manager.conf, http.conf and sip.conf) the names of the certificate
- * files and cipher to use, and then run ssl_setup() to create an appropriate
+ * files and cipher to use, and then run ssl_setup() to create an appropriate
* data structure named ssl_ctx.
*
* If we support multiple domains, presumably we need to read multiple
* and their setup should be moved to a more central place, e.g. asterisk.conf
* and the source files that processes it. Similarly, ssl_setup() should
* be run earlier in the startup process so modules have it available.
- *
+ *
* \ref AstTlsOverview
*
* \todo For SIP, the SubjectAltNames should be checked on verification
#define LEN_T size_t
#endif
-/*!
+/*!
* \brief attempts to connect and start tcptls session, on error the tcptls_session's
* ref count is decremented, fd and file are closed, and NULL is returned.
*/
struct tdd_state;
typedef struct tdd_state TDDSTATE;
-/*! CallerID Initialization
+/*! CallerID Initialization
* Initializes the TDD system. Mostly stuff for inverse FFT
*/
void tdd_init(void);
*/
int tdd_generate(struct tdd_state *tdd, unsigned char *buf, const char *string);
-/*! Create a TDD state machine
+/*! Create a TDD state machine
* This function returns a malloc'd instance of the tdd_state data structure.
* Returns a pointer to a malloc'd tdd_state structure, or NULL on error.
*/
*/
int tdd_feed(struct tdd_state *tdd, unsigned char *ubuf, int samples);
-/*! Free a TDD state machine
+/*! Free a TDD state machine
* \param tdd This is the tdd_state state machine to free
* This function frees tdd_state tdd.
*/
void tdd_free(struct tdd_state *tdd);
-/*! Generate Echo Canceller disable tone (2100HZ)
+/*! Generate Echo Canceller disable tone (2100HZ)
* \param outbuf This is the buffer to receive the tone data
* \param len This is the length (in samples) of the tone data to generate
* Returns 0 if no error, and -1 if error.
int ast_tdd_gen_ecdisa(unsigned char *outbuf, int len);
-/*! Generate hold tone
+/*! Generate hold tone
* \param outbuf This is the buffer to receive the tone data
*/
int tdd_gen_holdtone(unsigned char* outbuf);
* \endcode
*/
#define AST_THREADSTORAGE(name) \
- AST_THREADSTORAGE_CUSTOM_SCOPE(name, NULL, ast_free_ptr, static)
+ AST_THREADSTORAGE_CUSTOM_SCOPE(name, NULL, ast_free_ptr, static)
#define AST_THREADSTORAGE_PUBLIC(name) \
- AST_THREADSTORAGE_CUSTOM_SCOPE(name, NULL, ast_free_ptr,)
+ AST_THREADSTORAGE_CUSTOM_SCOPE(name, NULL, ast_free_ptr,)
#define AST_THREADSTORAGE_EXTERNAL(name) \
extern struct ast_threadstorage name
#define AST_THREADSTORAGE_RAW(name) \
* \brief Retrieve thread storage
*
* \param ts This is a pointer to the thread storage structure declared by using
- * the AST_THREADSTORAGE macro. If declared with
+ * the AST_THREADSTORAGE macro. If declared with
* AST_THREADSTORAGE(my_buf), then this argument would be (&my_buf).
* \param init_size This is the amount of space to be allocated the first time
* this thread requests its data. Thus, this should be the size that the
* \param i An instance of the \c ast_timing_interfaces structure with pointers
* to the functions provided by the timing implementation.
*
- * \retval NULL failure
+ * \retval NULL failure
* \retval non-Null handle to be passed to ast_unregister_timing_interface() on success
* \since 1.6.1
*/
};
/*! \brief
- * Descriptor of a translator.
+ * Descriptor of a translator.
*
* Name, callbacks, and various options
* related to run-time operation (size of buffers, auxiliary
* on computation time. This cost value is computed based
* on the time required to translate sample data. */
- int (*newpvt)(struct ast_trans_pvt *); /*!< initialize private data
+ int (*newpvt)(struct ast_trans_pvt *); /*!< initialize private data
* associated with the translator */
int (*framein)(struct ast_trans_pvt *pvt, struct ast_frame *in);
- /*!< Input frame callback. Store
+ /*!< Input frame callback. Store
* (and possibly convert) input frame. */
struct ast_frame * (*frameout)(struct ast_trans_pvt *pvt);
- /*!< Output frame callback. Generate a frame
+ /*!< Output frame callback. Generate a frame
* with outbuf content. */
void (*destroy)(struct ast_trans_pvt *pvt);
- /*!< cleanup private data, if needed
+ /*!< cleanup private data, if needed
* (often unnecessary). */
struct ast_frame * (*sample)(void); /*!< Generate an example frame */
struct ast_format **dst_fmt_out,
struct ast_format **src_fmt_out);
-/*!
+/*!
* \brief Builds a translator path
- * Build a path (possibly NULL) from source to dest
+ * Build a path (possibly NULL) from source to dest
* \param dst dest destination format
* \param src source source format
* \return ast_trans_pvt on success, NULL on failure
* Asterisk -- An open source telephony toolkit.
*
* UDPTL support for T.38
- *
+ *
* Copyright (C) 2005, Steve Underwood, partly based on RTP code which is
* Copyright (C) 1999-2004, Digium, Inc.
*
* \brief Associates a character string 'tag' with a UDPTL session.
* \param udptl The UDPTL session.
* \param format printf-style format string used to construct the tag
- *
+ *
* This function formats a tag for the specified UDPTL
* session, so that any log messages generated by the UDPTL stack
* related to that session will include the tag and the reader of
void ast_udptl_set_local_max_ifp(struct ast_udptl *udptl, unsigned int max_ifp);
-/*!
+/*!
* \brief retrieves local_max_datagram.
- *
+ *
* \retval positive value representing max datagram size.
* \retval 0 if no value is present
*/
unsigned int ast_udptl_get_local_max_datagram(struct ast_udptl *udptl);
-/*!
+/*!
* \brief sets far max datagram size. If max_datagram is = 0, the far max datagram
* size is set to a default value.
*/
unsigned int ast_udptl_get_far_max_datagram(const struct ast_udptl *udptl);
-/*!
+/*!
* \brief retrieves far max ifp
- *
+ *
* \retval positive value representing max ifp size
* \retval 0 if no value is present
*/
#endif
#endif /* _ASTERISK_XML_H */
-
*/
/*! \file
- * \brief
+ * \brief
* jitterbuf: an application-independent jitterbuffer
* \ref jitterbuf.c
*/
/*! \name configuration constants */
/*@{ */
/*! Number of historical timestamps to use in calculating jitter and drift */
-#define JB_HISTORY_SZ 500
+#define JB_HISTORY_SZ 500
/*! what percentage of timestamps should we drop from the history when we examine it;
* this might eventually be something made configurable */
#define JB_HISTORY_DROPPCT 3
/*! the maximum droppct we can handle (say it was configurable). */
#define JB_HISTORY_DROPPCT_MAX 4
/*! the size of the buffer we use to keep the top and botton timestamps for dropping */
-#define JB_HISTORY_MAXBUF_SZ JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100
+#define JB_HISTORY_MAXBUF_SZ JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100
/*! amount of additional jitterbuffer adjustment */
#define JB_TARGET_EXTRA 40
/*! ms between growing and shrinking; may not be honored if jitterbuffer runs out of space */
* you will leak queued frames, and some internal structures */
void jb_reset(jitterbuf *jb);
-/*!\brief queue a frame
- *
- * data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time)
- * now=now (in receiver's time) return value is one of
+/*!\brief queue a frame
+ *
+ * data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time)
+ * now=now (in receiver's time) return value is one of
* JB_OK: Frame added. Last call to jb_next() still valid
* JB_DROP: Drop this frame immediately
* JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame
* JB_OK: You've got frame!
* JB_DROP: Here's an audio frame you should just drop. Ask me again for this time..
* JB_NOFRAME: There's no frame scheduled for this time.
- * JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame)
+ * JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame)
* JB_EMPTY: The jb is empty.
*/
enum jb_return_code jb_get(jitterbuf *jb, jb_frame *frame, long now, long interpl);
/*! \brief unconditionally get frames from jitterbuf until empty */
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout);
-/*! \brief when is the next frame due out, in receiver's time (0=EMPTY)
+/*! \brief when is the next frame due out, in receiver's time (0=EMPTY)
* This value may change as frames are added (esp non-audio frames) */
long jb_next(jitterbuf *jb);
#define SLIST_HEAD_INITIALIZER(head) \
{ NULL }
-
+
#define SLIST_ENTRY(type) \
struct { \
struct type *sle_next; /* next element */ \
}
-
+
/*
* Singly-linked List functions.
*/
#endif /* KERNEL */
#endif /* !_SYS_QUEUE_H_ */
-
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
-
+
if [ -d $dst ]; then
instcmd=:
chmodcmd=""
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
+# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f $src -o -d $src ]
echo "install: $src does not exist"
exit 1
fi
-
+
if [ x"$dst" = x ]
then
echo "install: no destination specified"
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
-defaultIFS='
+defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
# If we're going to rename the final executable, determine the name now.
- if [ x"$transformarg" = x ]
+ if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
- dstfile=`basename $dst $transformbasename |
+ dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
- if [ x"$dstfile" = x ]
+ if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
- $doit $mvcmd $dsttmp $dstdir/$dstfile
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
ast_sockaddr_set_port(ourip, port);
return res;
}
-
#endif /* TEST_TANDEM_TRANSCODING */
}
-
/* A Bison parser, made by GNU Bison 2.4.1. */
/* Skeleton implementation for Bison's Yacc-like parsers in C
-
+
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
-
+
This program 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 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but 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, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Line 189 of yacc.c */
#line 1 "ast_expr2.y"
-/* Written by Pace Willisson (pace@blitz.com)
+/* Written by Pace Willisson (pace@blitz.com)
* and placed in the public domain.
*
* Largely rewritten by J.T. Conklin (jtc@wimsey.com)
*
* And then overhauled twice by Steve Murphy (murf@digium.com)
* to add double-quoted strings, allow mult. spaces, improve
- * error messages, and then to fold in a flex scanner for the
+ * error messages, and then to fold in a flex scanner for the
* yylex operation.
*
* $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $
#include <stdio.h>
#if !defined(STANDALONE) && !defined(STANDALONE2) \
-
+
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#else
#ifndef __USE_ISOC99
AST_EXPR_NODE_COMMA, AST_EXPR_NODE_STRING, AST_EXPR_NODE_VAL
} ;
-struct expr_node
+struct expr_node
{
enum node_type type;
struct val *val;
yyscan_t scanner;
struct ast_channel *chan;
};
-
+
static int chk_div __P((FP___TYPE, FP___TYPE));
static int chk_minus __P((FP___TYPE, FP___TYPE, FP___TYPE));
static int chk_plus __P((FP___TYPE, FP___TYPE, FP___TYPE));
define it here, we have no definition yet for YYSTYPE. */
int ast_yyerror(const char *,YYLTYPE *, struct parse_io *);
-
+
/* I wanted to add args to the yyerror routine, so I could print out
some useful info about the error. Not as easy as it looks, but it
is possible. */
# define YYMAXDEPTH 10000
#endif
-\f
+
#if YYERROR_VERBOSE
}
}
#endif /* YYERROR_VERBOSE */
-\f
+
/*-----------------------------------------------.
| Release the memory associated to this symbol. |
if( (yyvsp[(1) - (1)].val)->type == AST_EXPR_number )
((struct parse_io *)parseio)->val->u.i = (yyvsp[(1) - (1)].val)->u.i;
else
- ((struct parse_io *)parseio)->val->u.s = (yyvsp[(1) - (1)].val)->u.s;
+ ((struct parse_io *)parseio)->val->u.s = (yyvsp[(1) - (1)].val)->u.s;
free((yyvsp[(1) - (1)].val));
;}
break;
#line 382 "ast_expr2.y"
{/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
((struct parse_io *)parseio)->val->type = AST_EXPR_string;
- ((struct parse_io *)parseio)->val->u.s = strdup("");
+ ((struct parse_io *)parseio)->val->u.s = strdup("");
;}
break;
/* Line 1455 of yacc.c */
#line 412 "ast_expr2.y"
{ (yyval.val) = (yyvsp[(2) - (3)].val);
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;
DESTROY((yyvsp[(1) - (3)].val)); DESTROY((yyvsp[(3) - (3)].val)); ;}
break;
/* Line 1455 of yacc.c */
#line 416 "ast_expr2.y"
{ (yyval.val) = op_or ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 420 "ast_expr2.y"
- { (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 424 "ast_expr2.y"
{ (yyval.val) = op_eq ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 428 "ast_expr2.y"
{ (yyval.val) = op_gt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
(yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 432 "ast_expr2.y"
- { (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 436 "ast_expr2.y"
- { (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 440 "ast_expr2.y"
- { (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 444 "ast_expr2.y"
- { (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 448 "ast_expr2.y"
- { (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 452 "ast_expr2.y"
- { (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 456 "ast_expr2.y"
- { (yyval.val) = op_negate ((yyvsp[(2) - (2)].val));
- DESTROY((yyvsp[(1) - (2)].val));
- (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
+ { (yyval.val) = op_negate ((yyvsp[(2) - (2)].val));
+ DESTROY((yyvsp[(1) - (2)].val));
+ (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 460 "ast_expr2.y"
- { (yyval.val) = op_compl ((yyvsp[(2) - (2)].val));
- DESTROY((yyvsp[(1) - (2)].val));
- (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
+ { (yyval.val) = op_compl ((yyvsp[(2) - (2)].val));
+ DESTROY((yyvsp[(1) - (2)].val));
+ (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 464 "ast_expr2.y"
- { (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 468 "ast_expr2.y"
- { (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 472 "ast_expr2.y"
- { (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 476 "ast_expr2.y"
- { (yyval.val) = op_colon ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_colon ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 480 "ast_expr2.y"
- { (yyval.val) = op_eqtilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_eqtilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 484 "ast_expr2.y"
- { (yyval.val) = op_cond ((yyvsp[(1) - (5)].val), (yyvsp[(3) - (5)].val), (yyvsp[(5) - (5)].val));
- DESTROY((yyvsp[(2) - (5)].val));
- DESTROY((yyvsp[(4) - (5)].val));
- (yyloc).first_column = (yylsp[(1) - (5)]).first_column; (yyloc).last_column = (yylsp[(3) - (5)]).last_column;
+ { (yyval.val) = op_cond ((yyvsp[(1) - (5)].val), (yyvsp[(3) - (5)].val), (yyvsp[(5) - (5)].val));
+ DESTROY((yyvsp[(2) - (5)].val));
+ DESTROY((yyvsp[(4) - (5)].val));
+ (yyloc).first_column = (yylsp[(1) - (5)]).first_column; (yyloc).last_column = (yylsp[(3) - (5)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
/* Line 1455 of yacc.c */
#line 489 "ast_expr2.y"
- { (yyval.val) = op_tildetilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
- DESTROY((yyvsp[(2) - (3)].val));
- (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
+ { (yyval.val) = op_tildetilde ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
+ DESTROY((yyvsp[(2) - (3)].val));
+ (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
(yyloc).first_line=0; (yyloc).last_line=0;;}
break;
vp->type = AST_EXPR_number;
vp->u.i = i;
- return vp;
+ return vp;
}
static struct val *
}
if (isint)
vp->type = AST_EXPR_numeric_string;
- else
+ else
vp->type = AST_EXPR_string;
return vp;
static void
free_value (struct val *vp)
-{
+{
if (vp==NULL) {
return;
}
if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
- free (vp->u.s);
+ free (vp->u.s);
free(vp);
}
to_number (struct val *vp)
{
FP___TYPE i;
-
+
if (vp == NULL) {
ast_log(LOG_WARNING,"vp==NULL in to_number()\n");
return(0);
{
if (vp->type != AST_EXPR_string && vp->type != AST_EXPR_numeric_string)
return;
-
+
if( vp->u.s[0] == '"' && vp->u.s[strlen(vp->u.s)-1] == '"' )
{
char *f, *t;
f = vp->u.s;
t = vp->u.s;
-
+
while( *f )
{
if( *f && *f != '"' )
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
char s[4096];
char out[4096];
FILE *infile;
-
+
if( !argv[1] )
exit(20);
-
+
if( access(argv[1],F_OK)== 0 )
{
int ret;
-
+
infile = fopen(argv[1],"r");
if( !infile )
{
{
if( s[strlen(s)-1] == '\n' )
s[strlen(s)-1] = 0;
-
+
ret = ast_expr(s, out, sizeof(out), NULL);
printf("Expression: %s Result: [%d] '%s'\n",
s, ret, out);
static void destroy_arglist(struct expr_node *arglist)
{
struct expr_node *arglist_next;
-
+
while (arglist)
{
arglist_next = arglist->right;
struct expr_node *t = arglist;
char *argbuf;
int total_len = 0;
-
+
while (t) {
if (t != arglist)
total_len += 1; /* for the sep */
else
total_len += strlen(t->val->u.s);
}
-
+
t = t->right;
}
total_len++; /* for the null */
t = arglist;
while (t) {
char numbuf[30];
-
+
if (t != arglist)
strcat(argbuf,",");
-
+
if (t->val) {
if (t->val->type == AST_EXPR_number) {
sprintf(numbuf,FP___PRINTF,t->val->u.i);
ast_log(LOG_WARNING,"Hey! chan is NULL.\n");
if (!f)
ast_log(LOG_WARNING,"Hey! could not find func %s.\n", funcname->u.s);
-
+
if (f && chan) {
if (f->read) {
char workspace[512];
ast_log(LOG_ERROR,"Error! Function '%s' cannot be read!\n", funcname->u.s);
return (make_number ((FP___TYPE)0.0));
}
-
+
} else {
ast_log(LOG_ERROR, "Error! '%s' doesn't appear to be an available function!\n", funcname->u.s);
return (make_number ((FP___TYPE)0.0));
return (a);
}
}
-
+
static struct val *
op_and (struct val *a, struct val *b)
{
static struct val *
op_eq (struct val *a, struct val *b)
{
- struct val *r;
+ struct val *r;
if (isstring (a) || isstring (b)) {
to_string (a);
- to_string (b);
+ to_string (b);
r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) == 0));
} else {
#ifdef DEBUG_FOR_CONVERSIONS
{
int v1 = 1;
struct val *r;
-
+
if( !a )
{
v1 = 0;
if( a->u.i == 0 )
v1 = 0;
break;
-
+
case AST_EXPR_string:
if( a->u.s == 0 )
v1 = 0;
v1 = atoi(a->u.s);
}
break;
-
+
case AST_EXPR_numeric_string:
if( a->u.s == 0 )
v1 = 0;
break;
}
}
-
+
r = make_number (!v1);
free_value (a);
return r;
}
if (b->u.i == 0) {
- ast_log(LOG_WARNING, "division by zero\n");
+ ast_log(LOG_WARNING, "division by zero\n");
free_value(a);
free_value(b);
return make_number(INT_MAX);
free_value (b);
return r;
}
-
+
static struct val *
op_rem (struct val *a, struct val *b)
{
free_value (b);
return r;
}
-
+
static struct val *
op_colon (struct val *a, struct val *b)
ast_log(LOG_WARNING, "regcomp() error : %s\n", errbuf);
free_value(a);
free_value(b);
- return make_str("");
+ return make_str("");
}
/* compare string against pattern */
return v;
}
-
+
static struct val *
op_eqtilde (struct val *a, struct val *b)
ast_log(LOG_WARNING, "regcomp() error : %s\n", errbuf);
free_value(a);
free_value(b);
- return make_str("");
+ return make_str("");
}
/* compare string against pattern */
return v;
}
-
/* A Bison parser, made by GNU Bison 2.4.1. */
/* Skeleton interface for Bison's Yacc-like parsers in C
-
+
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
-
+
This program 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 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but 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, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif
-
-
-
%{
-/* Written by Pace Willisson (pace@blitz.com)
+/* Written by Pace Willisson (pace@blitz.com)
* and placed in the public domain.
*
* Largely rewritten by J.T. Conklin (jtc@wimsey.com)
*
* And then overhauled twice by Steve Murphy (murf@digium.com)
* to add double-quoted strings, allow mult. spaces, improve
- * error messages, and then to fold in a flex scanner for the
+ * error messages, and then to fold in a flex scanner for the
* yylex operation.
*
* $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $
#include <stdio.h>
#if !defined(STANDALONE) && !defined(STANDALONE2) \
-
+
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#else
#ifndef __USE_ISOC99
AST_EXPR_NODE_COMMA, AST_EXPR_NODE_STRING, AST_EXPR_NODE_VAL
} ;
-struct expr_node
+struct expr_node
{
enum node_type type;
struct val *val;
yyscan_t scanner;
struct ast_channel *chan;
};
-
+
static int chk_div __P((FP___TYPE, FP___TYPE));
static int chk_minus __P((FP___TYPE, FP___TYPE, FP___TYPE));
static int chk_plus __P((FP___TYPE, FP___TYPE, FP___TYPE));
define it here, we have no definition yet for YYSTYPE. */
int ast_yyerror(const char *,YYLTYPE *, struct parse_io *);
-
+
/* I wanted to add args to the yyerror routine, so I could print out
some useful info about the error. Not as easy as it looks, but it
is possible. */
#define ast_yyerror(x) ast_yyerror(x,&yyloc,parseio)
#define DESTROY(x) {if((x)->type == AST_EXPR_numeric_string || (x)->type == AST_EXPR_string) free((x)->u.s); (x)->u.s = 0; free(x);}
%}
-
+
%pure-parser
%locations
/* %debug for when you are having big problems */
%left <val> TOK_AND
%left <val> TOK_EQ TOK_GT TOK_LT TOK_GE TOK_LE TOK_NE
%left <val> TOK_PLUS TOK_MINUS
-%left <val> TOK_MULT TOK_DIV TOK_MOD
+%left <val> TOK_MULT TOK_DIV TOK_MOD
%right <val> TOK_COMPL
%left <val> TOK_COLON TOK_EQTILDE TOK_TILDETILDE
%left <val> TOK_RP TOK_LP
%type <arglist> arglist
%type <val> start expr
-%destructor { free_value($$); } expr TOKEN TOK_COND TOK_COLONCOLON TOK_OR TOK_AND TOK_EQ
- TOK_GT TOK_LT TOK_GE TOK_LE TOK_NE TOK_PLUS TOK_MINUS TOK_MULT TOK_DIV TOK_MOD TOK_COMPL TOK_COLON TOK_EQTILDE
+%destructor { free_value($$); } expr TOKEN TOK_COND TOK_COLONCOLON TOK_OR TOK_AND TOK_EQ
+ TOK_GT TOK_LT TOK_GE TOK_LE TOK_NE TOK_PLUS TOK_MINUS TOK_MULT TOK_DIV TOK_MOD TOK_COMPL TOK_COLON TOK_EQTILDE
TOK_RP TOK_LP TOK_TILDETILDE
%%
if( $1->type == AST_EXPR_number )
((struct parse_io *)parseio)->val->u.i = $1->u.i;
else
- ((struct parse_io *)parseio)->val->u.s = $1->u.s;
+ ((struct parse_io *)parseio)->val->u.s = $1->u.s;
free($1);
}
| {/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
((struct parse_io *)parseio)->val->type = AST_EXPR_string;
- ((struct parse_io *)parseio)->val->u.s = strdup("");
+ ((struct parse_io *)parseio)->val->u.s = strdup("");
}
;
$$ = $1; t->right = x; x->val = make_str("");}
;
-expr:
+expr:
TOKEN TOK_LP arglist TOK_RP { $$ = op_func($1,$3, ((struct parse_io *)parseio)->chan);
DESTROY($2);
DESTROY($4);
}
| TOKEN {$$ = $1;}
| TOK_LP expr TOK_RP { $$ = $2;
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;
DESTROY($1); DESTROY($3); }
| expr TOK_OR expr { $$ = op_or ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_AND expr { $$ = op_and ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_AND expr { $$ = op_and ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
| expr TOK_EQ expr { $$ = op_eq ($1, $3);
- DESTROY($2);
+ DESTROY($2);
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
| expr TOK_GT expr { $$ = op_gt ($1, $3);
- DESTROY($2);
+ DESTROY($2);
@$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_LT expr { $$ = op_lt ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_LT expr { $$ = op_lt ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_GE expr { $$ = op_ge ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_GE expr { $$ = op_ge ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_LE expr { $$ = op_le ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_LE expr { $$ = op_le ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_NE expr { $$ = op_ne ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_NE expr { $$ = op_ne ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_PLUS expr { $$ = op_plus ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_PLUS expr { $$ = op_plus ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_MINUS expr { $$ = op_minus ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_MINUS expr { $$ = op_minus ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | TOK_MINUS expr %prec TOK_COMPL { $$ = op_negate ($2);
- DESTROY($1);
- @$.first_column = @1.first_column; @$.last_column = @2.last_column;
+ | TOK_MINUS expr %prec TOK_COMPL { $$ = op_negate ($2);
+ DESTROY($1);
+ @$.first_column = @1.first_column; @$.last_column = @2.last_column;
@$.first_line=0; @$.last_line=0;}
- | TOK_COMPL expr { $$ = op_compl ($2);
- DESTROY($1);
- @$.first_column = @1.first_column; @$.last_column = @2.last_column;
+ | TOK_COMPL expr { $$ = op_compl ($2);
+ DESTROY($1);
+ @$.first_column = @1.first_column; @$.last_column = @2.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_MULT expr { $$ = op_times ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_MULT expr { $$ = op_times ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_DIV expr { $$ = op_div ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_DIV expr { $$ = op_div ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_MOD expr { $$ = op_rem ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_MOD expr { $$ = op_rem ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_COLON expr { $$ = op_colon ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_COLON expr { $$ = op_colon ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_EQTILDE expr { $$ = op_eqtilde ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_EQTILDE expr { $$ = op_eqtilde ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_COND expr TOK_COLONCOLON expr { $$ = op_cond ($1, $3, $5);
- DESTROY($2);
- DESTROY($4);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_COND expr TOK_COLONCOLON expr { $$ = op_cond ($1, $3, $5);
+ DESTROY($2);
+ DESTROY($4);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
- | expr TOK_TILDETILDE expr { $$ = op_tildetilde ($1, $3);
- DESTROY($2);
- @$.first_column = @1.first_column; @$.last_column = @3.last_column;
+ | expr TOK_TILDETILDE expr { $$ = op_tildetilde ($1, $3);
+ DESTROY($2);
+ @$.first_column = @1.first_column; @$.last_column = @3.last_column;
@$.first_line=0; @$.last_line=0;}
;
vp->type = AST_EXPR_number;
vp->u.i = i;
- return vp;
+ return vp;
}
static struct val *
}
if (isint)
vp->type = AST_EXPR_numeric_string;
- else
+ else
vp->type = AST_EXPR_string;
return vp;
static void
free_value (struct val *vp)
-{
+{
if (vp==NULL) {
return;
}
if (vp->type == AST_EXPR_string || vp->type == AST_EXPR_numeric_string)
- free (vp->u.s);
+ free (vp->u.s);
free(vp);
}
to_number (struct val *vp)
{
FP___TYPE i;
-
+
if (vp == NULL) {
ast_log(LOG_WARNING,"vp==NULL in to_number()\n");
return(0);
{
if (vp->type != AST_EXPR_string && vp->type != AST_EXPR_numeric_string)
return;
-
+
if( vp->u.s[0] == '"' && vp->u.s[strlen(vp->u.s)-1] == '"' )
{
char *f, *t;
f = vp->u.s;
t = vp->u.s;
-
+
while( *f )
{
if( *f && *f != '"' )
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
char s[4096];
char out[4096];
FILE *infile;
-
+
if( !argv[1] )
exit(20);
-
+
if( access(argv[1],F_OK)== 0 )
{
int ret;
-
+
infile = fopen(argv[1],"r");
if( !infile )
{
{
if( s[strlen(s)-1] == '\n' )
s[strlen(s)-1] = 0;
-
+
ret = ast_expr(s, out, sizeof(out), NULL);
printf("Expression: %s Result: [%d] '%s'\n",
s, ret, out);
static void destroy_arglist(struct expr_node *arglist)
{
struct expr_node *arglist_next;
-
+
while (arglist)
{
arglist_next = arglist->right;
struct expr_node *t = arglist;
char *argbuf;
int total_len = 0;
-
+
while (t) {
if (t != arglist)
total_len += 1; /* for the sep */
else
total_len += strlen(t->val->u.s);
}
-
+
t = t->right;
}
total_len++; /* for the null */
t = arglist;
while (t) {
char numbuf[30];
-
+
if (t != arglist)
strcat(argbuf,",");
-
+
if (t->val) {
if (t->val->type == AST_EXPR_number) {
sprintf(numbuf,FP___PRINTF,t->val->u.i);
ast_log(LOG_WARNING,"Hey! chan is NULL.\n");
if (!f)
ast_log(LOG_WARNING,"Hey! could not find func %s.\n", funcname->u.s);
-
+
if (f && chan) {
if (f->read) {
char workspace[512];
ast_log(LOG_ERROR,"Error! Function '%s' cannot be read!\n", funcname->u.s);
return (make_number ((FP___TYPE)0.0));
}
-
+
} else {
ast_log(LOG_ERROR, "Error! '%s' doesn't appear to be an available function!\n", funcname->u.s);
return (make_number ((FP___TYPE)0.0));
return (a);
}
}
-
+
static struct val *
op_and (struct val *a, struct val *b)
{
static struct val *
op_eq (struct val *a, struct val *b)
{
- struct val *r;
+ struct val *r;
if (isstring (a) || isstring (b)) {
to_string (a);
- to_string (b);
+ to_string (b);
r = make_number ((FP___TYPE)(strcoll (a->u.s, b->u.s) == 0));
} else {
#ifdef DEBUG_FOR_CONVERSIONS
{
int v1 = 1;
struct val *r;
-
+
if( !a )
{
v1 = 0;
if( a->u.i == 0 )
v1 = 0;
break;
-
+
case AST_EXPR_string:
if( a->u.s == 0 )
v1 = 0;
v1 = atoi(a->u.s);
}
break;
-
+
case AST_EXPR_numeric_string:
if( a->u.s == 0 )
v1 = 0;
break;
}
}
-
+
r = make_number (!v1);
free_value (a);
return r;
}
if (b->u.i == 0) {
- ast_log(LOG_WARNING, "division by zero\n");
+ ast_log(LOG_WARNING, "division by zero\n");
free_value(a);
free_value(b);
return make_number(INT_MAX);
free_value (b);
return r;
}
-
+
static struct val *
op_rem (struct val *a, struct val *b)
{
free_value (b);
return r;
}
-
+
static struct val *
op_colon (struct val *a, struct val *b)
ast_log(LOG_WARNING, "regcomp() error : %s\n", errbuf);
free_value(a);
free_value(b);
- return make_str("");
+ return make_str("");
}
/* compare string against pattern */
return v;
}
-
+
static struct val *
op_eqtilde (struct val *a, struct val *b)
ast_log(LOG_WARNING, "regcomp() error : %s\n", errbuf);
free_value(a);
free_value(b);
- return make_str("");
+ return make_str("");
}
/* compare string against pattern */
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#define EOB_ACT_LAST_MATCH 2
#define YY_LESS_LINENO(n)
-
+
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
do \
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
yyscan_t scanner;
struct ast_channel *chan;
};
-
+
void ast_yyset_column(int column_no, yyscan_t yyscanner);
int ast_yyget_column(yyscan_t yyscanner);
static int curlycount = 0;
/* This must go here because YYSTYPE and YYLTYPE are included
* from bison output in section 1.*/
# define yylval yyg->yylval_r
-
+
# define yylloc yyg->yylloc_r
-
+
int ast_yylex_init (yyscan_t* scanner);
int ast_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
void ast_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
YYLTYPE *ast_yyget_lloc (yyscan_t yyscanner );
-
+
void ast_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
#endif
static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner);
-
+
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif
YY_BUFFER_STATE ast_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
b = (YY_BUFFER_STATE) ast_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in ast_yy_create_buffer()" );
#ifndef __cplusplus
extern int isatty (int );
#endif /* __cplusplus */
-
+
/* Initializes or reinitializes a buffer.
* This function is sometimes called more than once on the same buffer,
* such as during a ast_yyrestart() or at EOF.
}
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
+
errno = oerrno;
}
, yyscanner);
if ( ! yyg->yy_buffer_stack )
YY_FATAL_ERROR( "out of dynamic memory in ast_yyensure_buffer_stack()" );
-
+
memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
+
yyg->yy_buffer_stack_max = num_to_alloc;
yyg->yy_buffer_stack_top = 0;
return;
* @param base the character buffer
* @param size the size in bytes of the character buffer
* @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object.
*/
YY_BUFFER_STATE ast_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
if ( size < 2 ||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
base[size-1] != YY_END_OF_BUFFER_CHAR )
*/
YY_BUFFER_STATE ast_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
-
+
return ast_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
}
char *buf;
yy_size_t n;
int i;
-
+
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
buf = (char *) ast_yyalloc(n ,yyscanner );
int ast_yyget_lineno (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yylineno;
}
int ast_yyget_column (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yycolumn;
}
/* lineno is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "ast_yyset_lineno called with no buffer" , yyscanner);
-
+ yy_fatal_error( "ast_yyset_lineno called with no buffer" , yyscanner);
+
yylineno = line_number;
}
/* column is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "ast_yyset_column called with no buffer" , yyscanner);
-
+ yy_fatal_error( "ast_yyset_column called with no buffer" , yyscanner);
+
yycolumn = column_no;
}
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yylloc;
}
-
+
void ast_yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yylloc = yylloc_param;
}
-
+
/* User-visible API */
/* ast_yylex_init is special because it creates the scanner itself, so it is
errno = EINVAL;
return 1;
}
-
+
*ptr_yy_globals = (yyscan_t) ast_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-
+
if (*ptr_yy_globals == NULL){
errno = ENOMEM;
return 1;
}
-
+
/* By setting to 0xAA, we expose bugs in
yy_init_globals. Leave at 0x00 for releases. */
memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
+
ast_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
+
return yy_init_globals ( *ptr_yy_globals );
}
extra_error_message[0] = 0;
}
-static const char * const expr2_token_equivs1[] =
+static const char * const expr2_token_equivs1[] =
{
"TOKEN",
"TOK_COND",
"TOK_LP"
};
-static const char * const expr2_token_equivs2[] =
+static const char * const expr2_token_equivs2[] =
{
"<token>",
"?",
free(s2);
return(0);
}
-
return 0;
}
#endif /* defined(DEBUG_FD_LEAKS) */
-
return __ao2_container_alloc_hash_debug(ao2_options, container_options, 1, NULL,
sort_fn, cmp_fn, tag, file, line, func, ref_debug);
}
-
tag, file, line, func, ref_debug);
return rb_ao2_container_init(self, container_options, sort_fn, cmp_fn);
}
-
ast_bridge_features_register(AST_BRIDGE_BUILTIN_ATTENDEDTRANSFER, feature_attended_transfer, NULL);
ast_bridge_features_register(AST_BRIDGE_BUILTIN_BLINDTRANSFER, feature_blind_transfer, NULL);
}
-
return NULL;
}
ao2_ref(tmp_cap, -1);
-
+
/* We have a channel. It's time now to set up the datastore of recalled CC interfaces.
* This will be a common task for all recall functions. If it were possible, I'd have
* the core do it automatically, but alas I cannot. Instead, I will provide a public
ast_clear_flag(ast_channel_flags(chan), flag);
ast_channel_unlock(chan);
}
-
ast_mutex_lock(&dblock);
ast_db_begin_transaction();
for (;;) {
- /* If dosync is set, db_sync() was called during sleep(1),
- * and the pending transaction should be committed.
+ /* If dosync is set, db_sync() was called during sleep(1),
+ * and the pending transaction should be committed.
* Otherwise, block until db_sync() is called.
*/
while (!dosync) {
--prefix=<install-root-dir>
Set the base directory in which to install. For example:
-
+
./configure --prefix=/usr/local
will cause files to be installed into /usr/local/bin, /usr/local/man,
CPPFLAGS="?"
Pass these flags to the C preprocessor. Note that CFLAGS is not passed
- to 'cpp' when 'configure' is looking for include files, so you must use
+ to 'cpp' when 'configure' is looking for include files, so you must use
CPPFLAGS instead if you need to help 'configure' find header files.
LD_LIBRARY_PATH="?"
/* zero the newly added memory, leave old data in */
(void) memset(&newbuffer[sz], 0, newsz - sz);
-
+
oldbuf = el->el_line.buffer;
el->el_line.buffer = newbuffer;
el->el_chared.c_undo.ptr = el->el_line.buffer +
(el->el_chared.c_undo.ptr - oldbuf);
el->el_chared.c_undo.buf = newbuffer;
-
+
if (!hist_enlargebuf(el, sz, newsz))
return 0;
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated automatically using autoconf version 2.13
+# Generated automatically using autoconf version 2.13
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
if echo ${host} | grep -q cygwin ; then \
echo "cygwin detected"; \
S_CFLAGS=""; \
- echo "/* cygdef.h. Generated automatically by configure. */
+ echo "/* cygdef.h. Generated automatically by configure. */
#ifndef _CYGDEF_H_
#define _CYGDEF_H_ 1
#include <sys/ioctl.h>
#define __linux__ 1
-
+
typedef void (*sig_t)(int);
-
+
#endif /* _CYGDEF_H_ */" > cygdef.h; \
echo "
/*)
ac_cv_path_AR="$AR" # Let the user override the test with a path.
;;
- ?:/*)
+ ?:/*)
ac_cv_path_AR="$AR" # Let the user override the test with a dos path.
;;
*)
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_dummy="$PATH"
- for ac_dir in $ac_dummy; do
+ for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_path_AR="$ac_dir/$ac_word"
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
\
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
\
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
\
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
\
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
fi
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
fi
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
CCSRCS="$CCSRCS np/fgetln.c"
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
CCSRCS="$CCSRCS np/vis.c"
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
CCSRCS="$CCSRCS np/unvis.c"
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
CCSRCS="$CCSRCS np/strlcpy.c"
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
-
+
else
echo "$ac_t""no" 1>&6
CCSRCS="$CCSRCS np/strlcat.c"
chmod +x $CONFIG_STATUS
rm -fr confdefs* $ac_clean_files
test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
-
-
-dnl
+dnl
dnl Process this file with autoconf to produce a configure script.
-dnl
+dnl
AC_INIT(Makefile.in)
dnl If CFLAGS isn't defined and using gcc, set CFLAGS to something reasonable.
if echo ${host} | grep -q cygwin ; then \
echo "cygwin detected"; \
S_CFLAGS=""; \
- echo "/* cygdef.h. Generated automatically by configure. */
+ echo "/* cygdef.h. Generated automatically by configure. */
#ifndef _CYGDEF_H_
#define _CYGDEF_H_ 1
#include <sys/ioctl.h>
#define __linux__ 1
-
+
typedef void (*sig_t)(int);
-
+
#endif /* _CYGDEF_H_ */" > cygdef.h; \
echo "
fi
-dnl
+dnl
dnl File lists. This is done here instead of in the Makefile in order to avoid
dnl the need for conditionals.
-dnl
+dnl
dnl .c files.
ACSRCS="common.c emacs.c vi.c"
AC_CONFIG_HEADER(config.h)
AC_OUTPUT([Makefile makelist])
-
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
-
+
if [ -d $dst ]; then
instcmd=:
else
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
+# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f $src -o -d $src ]
echo "install: $src does not exist"
exit 1
fi
-
+
if [ x"$dst" = x ]
then
echo "install: no destination specified"
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
-defaultIFS='
+defaultIFS='
'
IFS="${IFS-${defaultIFS}}"
# If we're going to rename the final executable, determine the name now.
- if [ x"$transformarg" = x ]
+ if [ x"$transformarg" = x ]
then
dstfile=`basename $dst`
else
- dstfile=`basename $dst $transformbasename |
+ dstfile=`basename $dst $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
- if [ x"$dstfile" = x ]
+ if [ x"$dstfile" = x ]
then
dstfile=`basename $dst`
else
# Now rename the file to the real destination.
$doit $rmcmd -f $dstdir/$dstfile &&
- $doit $mvcmd $dsttmp $dstdir/$dstfile
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
fi &&
|| *astate == S_HEX2) {
*astate = S_GROUND;
return (UNVIS_VALID);
- }
+ }
return (*astate == S_GROUND ? UNVIS_NOCHAR : UNVIS_SYNBAD);
}
if (c == '\\') {
*astate = S_START;
return (0);
- }
+ }
if ((flag & VIS_HTTPSTYLE) && c == '%') {
*astate = S_HEX1;
return (0);
}
*astate = S_GROUND;
return (UNVIS_SYNBAD);
-
+
case S_META:
if (c == '-')
*astate = S_META1;
return (UNVIS_SYNBAD);
}
return (0);
-
+
case S_META1:
*astate = S_GROUND;
*cp |= c;
return (UNVIS_VALID);
-
+
case S_CTRL:
if (c == '?')
*cp |= 0177;
case S_OCTAL2: /* second possible octal digit */
if (isoctal(c)) {
- /*
- * yes - and maybe a third
+ /*
+ * yes - and maybe a third
*/
*cp = (*cp << 3) + (c - '0');
- *astate = S_OCTAL3;
+ *astate = S_OCTAL3;
return (0);
- }
- /*
- * no - done with current sequence, push back passed char
+ }
+ /*
+ * no - done with current sequence, push back passed char
*/
*astate = S_GROUND;
return (UNVIS_VALIDPUSH);
*astate = S_HEX2;
return (0);
}
- /*
- * no - done with current sequence, push back passed char
+ /*
+ * no - done with current sequence, push back passed char
*/
*astate = S_GROUND;
return (UNVIS_VALIDPUSH);
return (UNVIS_VALID);
}
return (UNVIS_VALIDPUSH);
- default:
- /*
- * decoder in unknown state - (probably uninitialized)
+ default:
+ /*
+ * decoder in unknown state - (probably uninitialized)
*/
*astate = S_GROUND;
return (UNVIS_SYNBAD);
}
/*
- * strunvis - decode src into dst
+ * strunvis - decode src into dst
*
* Number of chars decoded into dst is returned, -1 on error.
* Dst is null terminated.
SVIS(dst, c, flag, nextc, extra); \
} \
while (/*CONSTCOND*/0)
-
+
/*
* This is SVIS, the central macro of vis.
* dst: Pointer to the destination buffer
* be encoded, too. These functions are useful e. g. to
* encode strings in such a way so that they are not interpreted
* by a shell.
- *
+ *
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
- * is returned.
+ * is returned.
*
* Strsvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
vis(dst, c, flag, nextc)
char *dst;
int c, flag, nextc;
-
+
{
char *extra;
/*
* strvis, strvisx - visually encode characters from src into dst
- *
+ *
* Dst must be 4 times the size of src to account for possible
* expansion. The length of dst, not including the trailing NULL,
- * is returned.
+ * is returned.
*
* Strvisx encodes exactly len bytes from src into dst.
* This is useful for encoding a block of data.
typedef struct el_read_t {
el_rfunc_t read_char; /* Function to read a character */
} el_read_t;
-
+
protected int read_init(EditLine *);
protected int el_read_setfn(EditLine *, el_rfunc_t);
protected el_rfunc_t el_read_getfn(EditLine *);
break;
}
}
-
+
/* read settings from configuration file */
el_source(e, NULL);
maxlen = match_len;
}
matches_num = i - 1;
-
+
/* newline to get on next line from command line */
fprintf(e->el_outfile, "\n");
for(i=1; i < lins; i++)
el->el_vdisplay[i-1] = el->el_vdisplay[i];
- firstline[0] = '\0'; /* empty the string */
+ firstline[0] = '\0'; /* empty the string */
el->el_vdisplay[i-1] = firstline;
} else
el->el_refresh.r_cursor.v++;
if (el->el_cursor.v + 1 >= el->el_term.t_size.v) {
int i, lins = el->el_term.t_size.v;
char *firstline = el->el_display[0];
-
+
for(i=1; i < lins; i++)
el->el_display[i-1] = el->el_display[i];
(el->el_cursor.h & 0370);
i < (where & 0370);
i += 8)
- term__putc('\t');
+ term__putc('\t');
/* then tab over */
el->el_cursor.h = where & 0370;
}
#else
#include "fskmodem_float.c"
#endif
-
{
return load_indications(1);
}
-
{
return media_index_update(index, variant, NULL);
}
-
ast_cli(a->fd, "%-20.20s: %-20.20s State:%-15.15s Presence:%-15.15s Watchers %2d\n",
buf,
ast_get_extension_app(hint->exten),
- ast_extension_state2str(hint->laststate),
- ast_presence_state2str(hint->last_presence_state),
+ ast_extension_state2str(hint->laststate),
+ ast_presence_state2str(hint->last_presence_state),
watchers);
num++;
}
float old_weight;
float new_weight;
float gain;
-
+
if (s->missing_samples) {
/* Although we have a real signal, we need to smooth it to fit well
with the synthetic signal we used for the previous block */
return ready_descriptors;
#endif
}
-
-
}
/* Make sure any previous value in ast_rtp_mime_types is cleaned up */
- memset(&ast_rtp_mime_types[x], 0, sizeof(struct ast_rtp_mime_type));
+ memset(&ast_rtp_mime_types[x], 0, sizeof(struct ast_rtp_mime_type));
if (format) {
ast_rtp_mime_types[x].payload_type.asterisk_format = 1;
ast_rtp_mime_types[x].payload_type.format = ao2_bump(format);
ao2_cleanup(s->format);
ast_free(s);
}
-
}
return stasis_caching_get_topic(one->topic_cached);
}
-
{
return ast_strptime_locale(s, format, tm, NULL);
}
-
{
int alive;
- /* The following is equivalent to
+ /* The following is equivalent to
*
* while (threadpool_execute(worker->pool));
*
pthread_mutex_unlock(&threadstoragelock);
ast_cli(a->fd, "%10d bytes allocated in %d allocation%s\n", (int) len, count, count > 1 ? "s" : "");
-
+
return CLI_SUCCESS;
}
}
pthread_mutex_unlock(&threadstoragelock);
-
+
AST_LIST_TRAVERSE(&file_summary, file, entry) {
len += file->len;
count += file->count;
}
#endif /* !defined(DEBUG_THREADLOCALS) */
-
ast_log(LOG_NOTICE, "u-Law tandem transcoding test complete.\n");
#endif /* TEST_TANDEM_TRANSCODING */
}
-
}
#endif /* defined(HAVE_LIBXML2) */
-
}
#endif /* AST_XML_DOCS */
-
-
#
# Asterisk -- A telephony toolkit for Linux.
-#
+#
# Makefile for Menuselect
#
# Copyright (C) 2005-2008, Digium, Inc.
libncurses -- This is needed for the curses frontend.
libnewt -- This is needed for the newt frontend (optional).
libxml2 -- This library, the XML C parser and toolkit of Gnome, is used for
- XML parsing.
+ XML parsing.
(http://xmlsoft.org/)
ENVIRONMENT SETUP
name="MENUSELECT_APPS"
The name attribute is required. This is the name of the variable that will
be in the output from menuselect.
-
+
displayname="Applications"
If this is specfied, this is what will be shown in the menu to the user.
that are *not* selected. This is because it is often convenient to be able
to define a full list in the Makefile and then filter out the results from
menuselect. Using GNU make, an example of this would be:
- APPS:=$(filter-out $(MENUSELECT_APPS),$(APPS))
+ APPS:=$(filter-out $(MENUSELECT_APPS),$(APPS))
remove_on_change=".lastclean"
This attribute can contain a space delimited list of files to be deleted
Member Attributes:
name="app_meetme"
- The name attribute is required. This is the value that will be added to the
+ The name attribute is required. This is the value that will be added to the
variable specified by the category when selected (or not selected) depending
on the setting of the positive_output attribute of the category.
-
+
displayname="Call Conferencing Application"
If this is specified, this will be provided as a description of this member
when the cursor is on it in the menu.
example of specifying a dependency for a member:
<member name="app_meetme">
<depend>zaptel</depend>
- </member>
+ </member>
Conflicts:
A conflict for a <member> is specified using a <conflict> tag. The name of
dummies:
touch linkedlists.h menuselect.c menuselect_curses.c \
menuselect.h menuselect_stub.c
-
# By default all modules will be built (except those marked not be
# used by default)
#
-# # exclude: Don't try to build the following modules.
+# # exclude: Don't try to build the following modules.
# #exclude app_test
#
# # You can have multiple items in each line, and multiple lines.
# # idea.
# #require chan_h323 app_directory
#
-# # random - the value for this keyword is a number between 1 and
+# # random - the value for this keyword is a number between 1 and
# # 100. The higher it is, more chances not to include each module.
# # Writes the list of modules that got hit to
# # build_tools/mods_removed_random .
my $AutoconfDepsFile = "build_tools/menuselect-deps";
my $AutoconfOptsFile = "makeopts";
-my %ConfigureOpts = (); #
+my %ConfigureOpts = (); #
# configuration file to read for some directives:
my $ConfFile = "build_tools/conf";
$src =~ m|.*/([^/]*)\.c|;
my $mod_name = $1;
my %data = (
- Type=>'module',
- Module=>$mod_name,
- Dir=> $dir,
+ Type=>'module',
+ Module=>$mod_name,
+ Dir=> $dir,
Avail=>1
);
next unless (m|^/\*\*\* MODULEINFO| .. m|^ *[*]+/|);
next unless (m|^[A-Z]| || m|^\s*<|);
- # At this point we can assume we're in the module
+ # At this point we can assume we're in the module
# info section.
chomp;
my ($var, $val, %attr) = extract_xml_key($_);
}
if ($var =~ /^(Depend|Use)$/i) {
# use uppercase for dependency names;
- $val = uc($val);
+ $val = uc($val);
}
if ( ! exists $data{$var} ) {
$data{$var} = [$val];
}
}
-# parse a partial XML document that is included as an input
+# parse a partial XML document that is included as an input
# for menuselect in a few places. Naturally a full-fledged XML parsing
# will not be done here. A line-based parsing that happens to work will
# have to do.
sub parse_menuselect_xml_file($) {
my $file_name = shift;
- open XML,$file_name or
+ open XML,$file_name or
die "Failed opening XML file $file_name: $!.\n";
-
+
my $header = <XML>;
$header =~ /^\s*<category\s+name="MENUSELECT_([^"]+)"\s/;
my $category = $1;
Module => $1,
DisplayName => $2,
Defaultenabled => ['no'],
- Avail => 1,
+ Avail => 1,
};
} elsif ($tag eq '/member') {
if (! exists $member->{$key}) {
$member->{$key} = [];
}
-
+
# Make sure dependencies are upper-case.
# FIXME: this is not the proper place for such a fix
$val = uc($val) if ($key =~ /Depend|Use/);
# Using "unshift' rather than 'push'.
- # For a singleton value this makes the action an
+ # For a singleton value this makes the action an
# override, as only the first value counts.
# For a list value, however, it means a reversed
# order.
}
}
-
+
close XML;
}
# Dump our data structure to a file.
sub dump_deps($) {
my $file = shift;
- open OUTPUT,">$file" or
+ open OUTPUT,">$file" or
die "cannot open category file $file for writing: $!\n";
- foreach my $mod_name (sort keys %ModInfo) {
+ foreach my $mod_name (sort keys %ModInfo) {
print OUTPUT "Key: $mod_name\n";
my $data = $ModInfo{$mod_name};
foreach my $var (sort keys %{$data} ) {
my ($lib, $avail_val) = split(/=/);
my ($avail, $avail_old) = split(/:/, $avail_val);
my $disabled = 0;
- if ($avail == -1) {
+ if ($avail == -1) {
$disabled = 1;
$avail = 0;
}
if (defined $avail_old) {
$ModInfo{$lib}{AvailOld} = $avail_old;
}
- # FIXME:
+ # FIXME:
if (($avail ne "0") && ($avail ne "1")) {
warning "Library $lib has invalid availability ".
"value <$avail> (check $AutoconfDepsFile).\n";
my $mod = $ModInfo{$mod_name};
my @deps = ();
- # if we have Depend or Use, put their values into
+ # if we have Depend or Use, put their values into
# @deps . If we have none, move on.
push @deps, @{$mod->{Depend}} if (exists $mod->{Depend});
push @deps, @{$mod->{Use}} if (exists $mod->{Use});
- next unless @deps;
+ next unless @deps;
- # TODO: don't print dependencies that are not external libs.
+ # TODO: don't print dependencies that are not external libs.
# Not done yet until I figure out if this is safe.
my $dep = join(' ', @deps);
print MAKEDEPSS "MENUSELECT_DEPENDS_".$mod->{Module}."=$dep\n";
}
close MODS_LIST;
-
+
}
die("Missing dependencies for the following modules: $failed_str\n");
}
-# Disable building for modules that were marked in the embedded module
+# Disable building for modules that were marked in the embedded module
# information as disabled for building by default.
sub apply_default_enabled() {
foreach my $mod (keys %ModInfo) {
}
}
-# generate menuselect.makeopts.
+# generate menuselect.makeopts.
# The values in this file obey to different semantics:
# 1. For modules, a module will be built unles listed here
# 2. For XML values (sounds, CFLAGS) it will be enabled if listed here
parse_menuselect_xml_file('build_tools/cflags.xml');
if ($ConfigureOpts{AST_DEVMODE} eq 'yes') {
parse_menuselect_xml_file('build_tools/cflags-devmode.xml');
- }
+ }
parse_menuselect_xml_file('sounds/sounds.xml');
apply_random_drop();
gen_makeopts();
}
-#
+#
# The main program start here
#
my ($var, $value) = split /: /, $_, 2;
$item{$var} = $value;
}
- # FIXME: dependencies are a list. This should not be a
+ # FIXME: dependencies are a list. This should not be a
# special case.
if (exists $item{Depend}) {
$item{Depend} = [split /\s*,\s*/,$item{Depend}];
return "Missing dependencies";
}
} elsif ($item->{Type} eq 'module') {
- if (exists ($item->{Defaultenabled}) &&
+ if (exists ($item->{Defaultenabled}) &&
$item->{Defaultenabled} =~ /^n/) {
return "Disabled";
} else {
struct { \
struct type *next; \
}
-
+
/*!
\brief Returns the first entry contained in a list.
\param head This is a pointer to the list head structure
PARTS=`LANG=C svn info ${1} | grep URL | awk '{print $2;}' | sed -e 's:^.*/svn/menuselect/::' | sed -e 's:/: :g'`
BRANCH=0
TEAM=0
-
+
REV=`svnversion -c ${1} | cut -d: -f2`
-
+
if [ "${PARTS}" = "trunk" ]
then
echo SVN-'trunk'-r${REV}
exit 0
fi
-
+
for PART in $PARTS
do
if [ ${BRANCH} != 0 ]
RESULT="${RESULT}-${PART}"
break
fi
-
+
if [ ${TEAM} != 0 ]
then
RESULT="${RESULT}-${PART}"
continue
fi
-
+
if [ "${PART}" = "branches" ]
then
BRANCH=1
RESULT="branch"
continue
fi
-
+
if [ "${PART}" = "tags" ]
then
BRANCH=1
RESULT="tag"
continue
fi
-
+
if [ "${PART}" = "team" ]
then
TEAM=1
continue
fi
done
-
+
echo SVN-${RESULT##-}-r${REV}
fi
LIBXML2_INCLUDE=@LIBXML2_INCLUDE@
LIBXML2_LIB=@LIBXML2_LIB@
-
* \file
*
* \author Russell Bryant <russell@digium.com>
- *
+ *
* \brief curses frontend for selection maintenance
*/
char buf[64];
if (!changed) {
- /* If all we have to do is move the cursor,
+ /* If all we have to do is move the cursor,
* then don't clear the screen and start over */
AST_LIST_TRAVERSE(&cat->members, mem, list) {
i++;
snprintf(buf, sizeof(buf), "[%s] %s", mem->enabled ? "*" : " ", mem->name);
}
waddstr(menu, buf);
-
+
if (curopt + 1 == i)
display_mem_info(menu, mem, start, end);
set_all(cat, 1);
changed = 1;
default:
- break;
+ break;
}
if (c == 'x' || c == 'X' || c == 'Q' || c == 'q')
break;
refresh();
maxopt = count_categories() - 1;
-
+
/* We have two windows - the title window at the top, and the menu window gets the rest */
title = newwin(TITLE_HEIGHT, max_x, 0, 0);
menu = newwin(max_y - TITLE_HEIGHT, max_x, TITLE_HEIGHT, 0);
- draw_title_window(title);
+ draw_title_window(title);
draw_main_menu(menu, curopt);
-
+
while ((c = getch())) {
switch (c) {
case KEY_UP:
play_space();
draw_title_window(title);
default:
- break;
+ break;
}
if (c == 'q' || c == 'Q' || c == 27 || c == 3) {
if (changes_made) {
}
}
if (c == 'x' || c == 'X' || c == 's' || c == 'S')
- break;
+ break;
draw_main_menu(menu, curopt);
}
wmove(stdscr, cur->oy, cur->ox);
waddch(stdscr, ' ');
wmove(stdscr, cur->y, cur->x);
- waddch(stdscr, type2chtype(cur->type));
+ waddch(stdscr, type2chtype(cur->type));
cur->ox = cur->x;
cur->oy = cur->y;
}
{
if (tank->x > 0)
tank->x--;
-
+
return 0;
}
GtkWidget *menubar;
gtk_init(&argc, &argv);
-
+
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 640, 480);
gtk_window_set_title(GTK_WINDOW(window), "GMenuselect");
main_vbox = gtk_vbox_new(FALSE, 1);
- gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
+ gtk_container_set_border_width(GTK_CONTAINER(main_vbox), 1);
gtk_container_add(GTK_CONTAINER(window), main_vbox);
menubar = get_menubar_menu(window);
column = gtk_tree_view_column_new_with_attributes("Conflicts With",
renderer, "text", COLUMN_CNFS, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
-
+
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("Description",
renderer, "text", COLUMN_DESC, NULL);
gtk_box_pack_end(GTK_BOX(main_vbox), s_window, TRUE, TRUE, 0);
gtk_widget_show_all(window);
-
+
gtk_main();
return main_res;
* \file
*
* \author Russell Bryant <russell@digium.com>
- *
+ *
* \brief Menu stub
*/
/*! \file
*
- * \brief Compatibility functions for strsep and strtoq missing on Solaris
+ * \brief Compatibility functions for strsep and strtoq missing on Solaris
*/
#include "autoconfig.h"
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
int asprintf(char **str, const char *fmt, ...)
{
va_list ap;
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for PBX modules
#
# Copyright (C) 1999-2006, Digium, Inc.
context test1
{
771 => {
- for( i=0;
- ${i} <= 3;
+ for( i=0;
+ ${i} <= 3;
i = ${i} + 1 )
NoOp(i is '${i}');
}
#include "t1/*.ael"
-context z
+context z
{
123 => NoOp(hi there, z);
124 => NoOp(hi there, z);
Verbose(2|${query}) ;
}
}
-
includes {
other|16:00-23:59|m0n-fri|*|*;
};
-
+
1 => {
for (x=0; ${x} < 3; x=${x} + 1) {
Verbose(x is ${x} !);
return;
y=${y}-1;
};
- };
+ };
regexten hint(nasty/Thingy&nasty/Thingamabob) 3 => {
- for (x=0; ${x} < 3; x=${x} + 1)
+ for (x=0; ${x} < 3; x=${x} + 1)
{
Verbose(x is ${x} !);
if( ${x} = 4 )
return;
y=10;
- while (${y} >= 0)
+ while (${y} >= 0)
{
Verbose(y is ${y} !);
if( ${y} = 4 )
y=${y}-1;
};
};
- };
+ };
4 => {
y=10;
- while (${y} >= 0)
+ while (${y} >= 0)
{
Verbose(y is ${y} !);
if( ${y} = 4 )
continue;
if( ${y} = 6 )
return;
- for (x=0; ${x} < 3; x=${x} + 1)
+ for (x=0; ${x} < 3; x=${x} + 1)
{
Verbose(x is ${x} !);
if( ${x} = 4 )
continue;
if( ${x} = 6 )
return;
- for (z=0; ${z} < 17; z=${z} + 1)
+ for (z=0; ${z} < 17; z=${z} + 1)
{
Verbose(z is ${z} !);
Verbose(z is ${z} !);
Verbose(z is ${z} !);
Verbose(z is ${z} !);
};
-
+
};
y=${y}-1;
};
- };
+ };
5 => {
&exten-gen(axel,brain);
};
context test1
{
- s =>
+ s =>
{
goto lab1;
if( ${testnotnull} )
context dialextens
{
- /*
+ /*
101 thru 123, 149 thru 152
*/
_10X => Dial(Zap/${EXTEN:2},30,Ttw);
_1ZX => Dial(Zap/${EXTEN:1},30,Ttw);
}
-/*
+/*
Due to extenal wiring:
dialing 125 will ring 101
goto y,lab1;
catch y
{ lab1:
- &funcB(${a},${b});
+ &funcB(${a},${b});
}
}
goto z,lab2;
catch z
{ lab2:
- &funcC(${a},${b});
+ &funcC(${a},${b});
}
}
Verbose(Finished 100000 levels deep call!);
}
83 => {
- switch (${EXTEN})
+ switch (${EXTEN})
{
pattern 8X:
Verbose(do something to prepare it);
Verbose(ChannelOnly=${ChannelOnly}; neat huh?);
Set(ChannelOnly=${CUT(CHANNEL,,1)});
Verbose(ChannelOnly=${ChannelOnly}; neat huh?);
- }
+ }
873 => {
NOOP(this is a forkcdr test);
Set(CALLERID(num)=1234567890);
context test1
{
- s =>
+ s =>
{
#include "apptest.ael2";
}
}
-
}
13 => NoOp(LuckyNumber!);
}
-
FWDVMBOX=1 ; // the VM box for this user
}
-macro std-exten( ext , dev )
+macro std-exten( ext , dev )
{
Dial(${dev}/${ext},20);
goto privacyManagerFailed|s|begin;
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case BUSY:
Voicemail(b${ext});
}
}
-macro std-priv-exten_1( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_1( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_2( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_2( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_3( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_3( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_4( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_4( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_5( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_5( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_6( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_6( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_7( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_7( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_8( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_8( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_9( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_9( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_10( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_10( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_11( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_11( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_12( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_12( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_13( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_13( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_14( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_14( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_15( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_15( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_16( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_16( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_17( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_17( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_18( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_18( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_19( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_19( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_20( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_20( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_21( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_21( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_22( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_22( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_23( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_23( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_24( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_24( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_25( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_25( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_26( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_26( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_27( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_27( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_28( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_28( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_29( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_29( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_30( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_30( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_31( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_31( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_32( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_32( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_33( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_33( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_34( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_34( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_35( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_35( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_36( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_36( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_37( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_37( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_38( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_38( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_39( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_39( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_40( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_40( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_41( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_41( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_42( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_42( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_43( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_43( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_44( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_44( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_45( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_45( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_46( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_46( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_47( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_47( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_48( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_48( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_49( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_49( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_50( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_50( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_51( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_51( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_52( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_52( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_53( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_53( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_54( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_54( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_55( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_55( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_56( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_56( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_57( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_57( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_58( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_58( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_59( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_59( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_60( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_60( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_61( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_61( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_62( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_62( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_63( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_63( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_64( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_64( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_65( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_65( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_66( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_66( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_67( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_67( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_68( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_68( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_69( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_69( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_70( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_70( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_71( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_71( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_72( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_72( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_73( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_73( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
Set(cidn=${DB(cidname/${CALLERID(num)})});
if( "${CALLERID(name)}" != "" )
{
- if( ("${cidn}" = "Privacy Manager" & "${CALLERID(name)}" != "Privacy Manager") | "${cidn}" = "" ) // if the entry isn't in the database,
+ if( ("${cidn}" = "Privacy Manager" & "${CALLERID(name)}" != "Privacy Manager") | "${cidn}" = "" ) // if the entry isn't in the database,
// or if an entry exists, and it's "Privacy Manager", empty, (or add other useless possibilities).
- {
+ {
Set(DB(cidname/${CALLERID(num)})=${CALLERID(name)}); // then set or override what's in the DB
}
}
// Now, we fill in the callerid info from the incoming entry, if it's stuff worth using
// Ignore fundamentally semi-anonymous information from local cell phones
// if the db has an entry for this number, and it's not a canned string from a cell phone company
- if( ( "${cidn}" != "" ) & ( "${CALLERID(name)}" = ""
- | "${CALLERID(name)}" = "CODY,WY "
- | "${CALLERID(name)}" = "POWELL,WY "
- | "${CALLERID(name)}" = "WIRELESS CALLER"
- | "${CALLERID(name)}" = "SUBSCRIBER,WIRE"
- | "${CALLERID(name)}" = "CELLULAR ONE"
- | "${CALLERID(name)}" = "Cellular One Customer"
- | "${CALLERID(name)}" = "CELLULAR ONE "
- | "${CALLERID(name)}" = "Privacy Manager"
- | "${CALLERID(name)}" = "RIVERTON,WY "
- | "${CALLERID(name)}" = "BASIN,WY "
+ if( ( "${cidn}" != "" ) & ( "${CALLERID(name)}" = ""
+ | "${CALLERID(name)}" = "CODY,WY "
+ | "${CALLERID(name)}" = "POWELL,WY "
+ | "${CALLERID(name)}" = "WIRELESS CALLER"
+ | "${CALLERID(name)}" = "SUBSCRIBER,WIRE"
+ | "${CALLERID(name)}" = "CELLULAR ONE"
+ | "${CALLERID(name)}" = "Cellular One Customer"
+ | "${CALLERID(name)}" = "CELLULAR ONE "
+ | "${CALLERID(name)}" = "Privacy Manager"
+ | "${CALLERID(name)}" = "RIVERTON,WY "
+ | "${CALLERID(name)}" = "BASIN,WY "
| "${CALLERID(name)}" = "BILLINGS,MT "
- | "${CALLERID(name)}" = "PROVO,UT "
- | "${CALLERID(name)}" = "TOLL FREE " ) ) // put stuff in the above, that the phone company tends to put in your callerid,
+ | "${CALLERID(name)}" = "PROVO,UT "
+ | "${CALLERID(name)}" = "TOLL FREE " ) ) // put stuff in the above, that the phone company tends to put in your callerid,
// that you would rather override with DB info
// there's no way to guess them all, but you can get the most popular ones...
// why cell phones can't do CID like everybody else, ....?
- {
+ {
Set(CALLERID(name)=${cidn}); // Override what the phone company provides with what's in the DB for this number.
}
}
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
{
BackGround(try_cell);
- CALLERID(num)=${cidnu}; // put the original number back
+ CALLERID(num)=${cidnu}; // put the original number back
Dial(Zap/2/${lookup},${waittime},${dialopts});
}
}
Dial(SIP/1${lookup}@tctwest,${waittime},${dialopts});
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
{
- Set(CALLERID(num)=${cidnu}); // put the original number back
+ Set(CALLERID(num)=${cidnu}); // put the original number back
BackGround(try_zap);
Dial(${ddev}/${dialnum},${waittime}|${dialopts});
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
macro callerid-liar()
{
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/priv-callerintros/LIAR.gsm&);
- Background(priv-liar); // Script: OOOps! Sorry! I don't allow men with ski masks pulled over their
+ Background(priv-liar); // Script: OOOps! Sorry! I don't allow men with ski masks pulled over their
// faces to get in the front door, and unidentified callers won't fair
// any better. You entered *MY* phone number. That won't work.
// If you are telemarketing, cross me off the list, and don't call again.
// If you did this by mistake, forgive my defenses, and call again.
// Alternate: (priv-liar2)
// Script: You have chosen to try to deceive my system and withold your CallerID,
- // by entering my own phone number as YOUR CallerID. I find this
+ // by entering my own phone number as YOUR CallerID. I find this
// offensive because you are being dishonest. I will not do business nor
// waste my time talking to anyone who is less than honest and forthcoming.
// Take me off your call list and do not call me again.
context privacyManagerFailed {
s => {
begin:
- Background(PrivManInstructions); // Script: OOps, that didn't go well. You need to enter *your* area code, and *your* 7 digit
+ Background(PrivManInstructions); // Script: OOps, that didn't go well. You need to enter *your* area code, and *your* 7 digit
// phone number, for a total of 10 digits, or you'll be handed over to the monkeys. Let's
// try this again, and hopefully you can get past our front-line defenses!
PrivacyManager();
}
}
loopback:
- ifTime(*|*|20-25|dec)
- {
- Playback(greetings/christmas);
+ ifTime(*|*|20-25|dec)
+ {
+ Playback(greetings/christmas);
}
- else ifTime(*|*|31|dec)
- {
- Playback(greetings/newyear);
+ else ifTime(*|*|31|dec)
+ {
+ Playback(greetings/newyear);
}
else ifTime(*|*|1|jan)
{
{
Playback(greetings/valentines);
}
- else ifTime(*|*|17|mar)
+ else ifTime(*|*|17|mar)
{
Playback(greetings/stPat);
}
- else ifTime(*|*|31|oct)
+ else ifTime(*|*|31|oct)
{
Playback(greetings/halloween);
}
- else ifTime(*|mon|15-21|jan)
+ else ifTime(*|mon|15-21|jan)
{
Playback(greetings/mlkDay);
}
else ifTime(*|sun|15-21|jun)
{
Playback(greetings/fathers);
- }
- else
+ }
+ else
{
Playback(greetings/hello); // None of the above? Just a plain hello will do
- }
+ }
Background(murphy-homeline-intro1); // Script: Hello-- Welcome to the Murphy's! If you already know what
// option you want, you don't have to wait for this entire spiel-- just
// have at it.
// to play with your introduction, dial 5.
// If we don't seem to be giving you the time of day, try 7.
// Have a good day!
-
+
}
1 => { // Sonya
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
&std-priv-exten(Zap/6r3&Sip/murf,1,25,mpA(beep)tw,telemarket,telemarket);
goto s|loopback;
}
- 4 => { // Voicemail
+ 4 => { // Voicemail
VoicemailMain();
goto s|loopback;
}
begin:
Background(intro-record-choices); // Script:
// If you want some advice about recording your
- // introduction, dial 1.
+ // introduction, dial 1.
// otherwise, dial 2, and introduce yourself after
// the beep.
}
// This is NOT meant to be a voice mail message, so
// please, don't say anything about why you are calling.
// After we are done making the recording, your introduction
- // will be saved for playback.
- // If you are the only person that would call from this number,
+ // will be saved for playback.
+ // If you are the only person that would call from this number,
// please state your name. Otherwise, state your business
- // or residence name instead. For instance, if you are
+ // or residence name instead. For instance, if you are
// friend of the family, say, Olie McPherson, and both
// you and your kids might call here a lot, you might
// say: "This is the distinguished Olie McPherson Residence!"
// "John, from the Park County Morgue. You stab 'em, we slab 'em!".
// Just one caution: the kids will hear what you record every time
// you call. So watch your language!
- // I will begin recording after the tone.
- // When you are done, hit the # key. Gather your thoughts and get
+ // I will begin recording after the tone.
+ // When you are done, hit the # key. Gather your thoughts and get
// ready. Remember, the # key will end the recording, and play back
// your intro. Good Luck, and Thank you!"
goto 2|begin;
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/4/greet.wav&);
Voicemail(u4);
goto homeline|s|loopback;
-
+
// SetMusicOnHold(erics);
// TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
// TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/4/greet.wav&);
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/7/greet.wav&);
&std-priv-exten(Zap/3r2&Zap/5r2,7,35,mtw,telemarket,telemarket);
goto homeline|s|loopback;
-
+
}
6 => {
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
1 => {
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/1/greet.wav&);
-
+
&std-priv-exten(Zap/6&Sip/murf,1,30,mtw,telemarket,telemarket);
- goto s|loopback;
+ goto s|loopback;
}
4 => {
- VoicemailMain();
+ VoicemailMain();
goto s|loopback;
}
6 => {
Hangup();
}
i => {
- Background(invalid);
+ Background(invalid);
goto s|loopback;
}
o => {
Wait(2);
Playtones(info);
Wait(5);
- Hangup();
+ Hangup();
}
790 => {
MeetMe(790,p);
// now include the telemarketer torture scripts!
#include "telemarket_torture.ael2"
-
-
// WORSE DESIGN: Instead of using the Background application, the Playback
// application is used. After taking so much time and trouble
-// to record this material, the caller must listen and enjoy
+// to record this material, the caller must listen and enjoy
// every syllable before they can make an option choice. None
// of that interrupting with a choice. We want them to savour
// every word!
context telemarket {
s => {
begin:
- Playback(telemarketer-intro); // ; Script:
+ Playback(telemarketer-intro); // ; Script:
// Due to the extremely high volume of calls from everything from telemarketers
// to Septic System Bacteria vendors, we are asking all such organizations
// to remove this number from their call list, or as need be, to add this
- // number to their No-Call list, whichever is relevent.
+ // number to their No-Call list, whichever is relevent.
// [THE CARROT:]
// We HAVE made some exceptions, and if you wish to see if your organization
// has been exempted, please listen to and follow the following prompts.
- //
+ //
// Otherwise, please Cease calling this number!
- //
+ //
Playback(telemarketer-choices);
// if you represent a charitable organization, please dial 1,
// if you represent a political organization, please dial 2.
// have sold our name and phone number to each other until we are now hounded
// day and night by literally hundreds of such organizations.
// Enough is Enough!
- //
- // If we have contributed to your cause in the past, we may, perhaps, be disposed to
+ //
+ // If we have contributed to your cause in the past, we may, perhaps, be disposed to
// do so in the future, at our option,
// we give no pledges nor make any commitments here.
// Send us material via the post if you feel this necessary
// but do not even consider email. Any email or further phone calls from your organization
- // in the future, will be considered an act of aggression, and we will
+ // in the future, will be considered an act of aggression, and we will
// blacklist your organization for the rest of our natural lives.
- //
+ //
// To see if your organization is exempt from these prohibitions, please
// comply with the following options.
Playback(telemark-charity-choices);
// If your organization is disease or genetic defect related, dial 1,
// If your organization is handicap related, dial 2.
// If your organization is a police or fireman or other similar support entity, please dial 3.
- // If your organization is a grade school to high school related
+ // If your organization is a grade school to high school related
// fund raiser or other type of activity, please dial 4.
// If your organization is a college or univerity or alumnis organization, please dial 5.
// If your organization is animal rights or ecology related organization, please dial 6.
context telemarket-sorry {
s => {
begin:
- Playback(telemarket-sorry);
+ Playback(telemarket-sorry);
// Sorry -- your organization is not exempt. Please stop calling us.
// Thank you. goodbye.
Hangup();
s => {
begin:
Playback(telemarket-success);
- // Congratulations. Your organization IS exempt. Please call us back,
+ // Congratulations. Your organization IS exempt. Please call us back,
// but this time, just act like a normal caller. Thank you. Goodbye.
Hangup();
}
Playback(telemark-politx-intro);
// Thank you for your patience, and I congratulate you for your persistence.
// Just a few more options!
- //
+ //
Playback(telemark-polit2-choices);
// if You represent the Communist Party USA, dial 1.
// if You represent the Constitution Party, dial 2.
s => {
begin:
Playback(telemark-poll-intro);
- // I'm sorry-- We are just not available for doing any polling at the moment. So,
+ // I'm sorry-- We are just not available for doing any polling at the moment. So,
// please remove us from your list.
goto telemarket-sorry|s|begin;
}
Playback(telemark-research-intro);
// I'd like to say I'd love to help you with your market survey, but that would be a complete
// and total lie. I am not interested in helping you with Market Surveys.
- //
+ //
// Please remove me from your call list. It just doesn't pay enough. But Thank you.
goto telemarket-sorry|s|begin;
}
s => {
begin:
Playback(telemark-mag-choices);
- // If you are calling to see if I would like a NEW free subscription
+ // If you are calling to see if I would like a NEW free subscription
// to your magazine or newsletter, please dial 1.
// If you are calling to see if I want to Renew an existing subscription, please dial 2.
// If you are representing some publisher, and want my opinion about something, or are doing
// some kind of survey, please dial 3.
- // If you are calling to verify that some previous caller actually called me, and the
+ // If you are calling to verify that some previous caller actually called me, and the
// verification information is correct, please dial 4.
// and if your call purpose doesn't match any of the above, please dial 5.
}
s => {
begin:
Playback(telemark-mag-new);
- // I'm sorry, I'm maxed out, and the answer is NO.
- // If you really think I'd LOVE to add your publication to the pile I already get,
+ // I'm sorry, I'm maxed out, and the answer is NO.
+ // If you really think I'd LOVE to add your publication to the pile I already get,
// Send something via the post. Don't call me.
// Thank you. bye.
Hangup();
begin:
Playback(telemark-mag-renew);
// So, you want to see if I want to Renew, do you? The answer is most likely "YES".
- //
- // But, I will not answer a long list of questions over the phone. Send such
- // categorization info via the post, and stop bothering me over the phone,
+ //
+ // But, I will not answer a long list of questions over the phone. Send such
+ // categorization info via the post, and stop bothering me over the phone,
// if this is what you want.
// Do you need verification information? Normally I opt out of such nonsense, if possible.
// If not, use whatever of the following you can:
begin:
Playback(telemark-mag-verify);
// If you are calling to verify that your own agents aren't ripping you off,
- // sorry, I can't help you. I opt out whenever I can, mainly because I'm not
+ // sorry, I can't help you. I opt out whenever I can, mainly because I'm not
// paid enough for this kind of thing. I always lie, and I can't remember
// what I might have said. Sorry. Goodbye.
Hangup();
begin:
Playback(telemark-comm-intro); // Script: Please leave your name, organization, and phone number, plus
// a short description of the purpose of your call, at the prompt.
- // We will do our best to respond to your call! And, in the mean time,
+ // We will do our best to respond to your call! And, in the mean time,
// do not forget to add us to your no-call list!
Voicemail(u82);
goto telemarket-sorry|s|begin;
begin:
Playback(telemark-other-intro);
// Please review the previous menu options, and see if you really don't
- // fit in one of the previous categories.
+ // fit in one of the previous categories.
// If you do not, go ahead, and call me again, and let me know what category
// I should have included in the above list. I appreciate this. Thank you much!
Hangup();
context test1
{
- test2 =>
+ test2 =>
{
#include "apptest.ael2";
}
}
-
if(${DB_EXISTS(Provider/${prov}/used)})
Set(MINUTES_USED=${DB_RESULT});
-
+
country_c = 0;
switch(${LEN(${ext})}) { //assuming all international numbers are 11 digits long.
case 10: //NXXNXXXXXX
country_c = ${ext:3:1};
break;
};
-
+
if("${prov}" = "${TRUNK}" & ${country_c} != 1) { // SunRocket international calls
Set(MINUTES_LIMIT=${DB(Provider/${prov}/limit)});
&announce_minutes($[${MINUTES_LIMIT} - ${MINUTES_USED}]);
_012. => { //fwdOUT
Set(CALLERID(name)=Central NJ);
Dial(IAX2/14301@fwdOUT/q${EXTEN:3},60,T);
- };
+ };
_013X. => { //NECC
Dial(${PSTNPROTO}/011${EXTEN:3}@${PSTN},60,T);
};
} else if("${SIP_HEADER(To)}" = "<sip:2271653@sipnet.ru>") {
jump 1@default;
} else
- jump 2@default;
+ jump 2@default;
};
};
t => jump #;
i => Playback(invalid);
};
-
FWDVMBOX=1 ; // the VM box for this user
}
-macro std-exten( ext , dev )
+macro std-exten( ext , dev )
{
Dial(${dev}/${ext},20);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case BUSY:
Voicemail(b${ext});
}
}
-macro std-priv-exten_1( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_1( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_2( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_2( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_3( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_3( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_4( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_4( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_5( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_5( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_6( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_6( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_7( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_7( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_8( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_8( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_9( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_9( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_10( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_10( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_11( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_11( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_12( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_12( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_13( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_13( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_14( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_14( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_15( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_15( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_16( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_16( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_17( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_17( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_18( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_18( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_19( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_19( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_20( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_20( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_21( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_21( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_22( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_22( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_23( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_23( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_24( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_24( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_25( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_25( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_26( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_26( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_27( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_27( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_28( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_28( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_29( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_29( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_30( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_30( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_31( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_31( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_32( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_32( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_33( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_33( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_34( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_34( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_35( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_35( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_36( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_36( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_37( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_37( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_38( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_38( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_39( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_39( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_40( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_40( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_41( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_41( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_42( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_42( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_43( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_43( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_44( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_44( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_45( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_45( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_46( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_46( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_47( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_47( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_48( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_48( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_49( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_49( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_50( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_50( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_51( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_51( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_52( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_52( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_53( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_53( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_54( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_54( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_55( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_55( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_56( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_56( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_57( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_57( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_58( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_58( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_59( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_59( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_60( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_60( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_61( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_61( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_62( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_62( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_63( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_63( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_64( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_64( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_65( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_65( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_66( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_66( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_67( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_67( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_68( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_68( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_69( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_69( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_70( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_70( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_71( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_71( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_72( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_72( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten_73( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten_73( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
}
-macro std-priv-exten( dev, ext , timeout, opts, torcont, dontcont )
+macro std-priv-exten( dev, ext , timeout, opts, torcont, dontcont )
{
Dial(${dev},${timeout},${opts});
NoOp(${DIALSTATUS} was chosen);
- switch(${DIALSTATUS})
+ switch(${DIALSTATUS})
{
case TORTURE:
goto ${torcont}|s|begin;
Set(cidn=${DB(cidname/${CALLERID(num)})});
if( "${CALLERID(name)}" != "" )
{
- if( ("${cidn}" = "Privacy Manager" & "${CALLERID(name)}" != "Privacy Manager") | "${cidn}" = "" ) // if the entry isn't in the database,
+ if( ("${cidn}" = "Privacy Manager" & "${CALLERID(name)}" != "Privacy Manager") | "${cidn}" = "" ) // if the entry isn't in the database,
// or if an entry exists, and it's "Privacy Manager", empty, (or add other useless possibilities).
- {
+ {
Set(DB(cidname/${CALLERID(num)})=${CALLERID(name)}); // then set or override what's in the DB
}
}
// Now, we fill in the callerid info from the incoming entry, if it's stuff worth using
// Ignore fundamentally semi-anonymous information from local cell phones
// if the db has an entry for this number, and it's not a canned string from a cell phone company
- if( ( "${cidn}" != "" ) & ( "${CALLERID(name)}" = ""
- | "${CALLERID(name)}" = "CODY,WY "
- | "${CALLERID(name)}" = "POWELL,WY "
- | "${CALLERID(name)}" = "WIRELESS CALLER"
- | "${CALLERID(name)}" = "SUBSCRIBER,WIRE"
- | "${CALLERID(name)}" = "CELLULAR ONE"
- | "${CALLERID(name)}" = "Cellular One Customer"
- | "${CALLERID(name)}" = "CELLULAR ONE "
- | "${CALLERID(name)}" = "Privacy Manager"
- | "${CALLERID(name)}" = "RIVERTON,WY "
- | "${CALLERID(name)}" = "BASIN,WY "
+ if( ( "${cidn}" != "" ) & ( "${CALLERID(name)}" = ""
+ | "${CALLERID(name)}" = "CODY,WY "
+ | "${CALLERID(name)}" = "POWELL,WY "
+ | "${CALLERID(name)}" = "WIRELESS CALLER"
+ | "${CALLERID(name)}" = "SUBSCRIBER,WIRE"
+ | "${CALLERID(name)}" = "CELLULAR ONE"
+ | "${CALLERID(name)}" = "Cellular One Customer"
+ | "${CALLERID(name)}" = "CELLULAR ONE "
+ | "${CALLERID(name)}" = "Privacy Manager"
+ | "${CALLERID(name)}" = "RIVERTON,WY "
+ | "${CALLERID(name)}" = "BASIN,WY "
| "${CALLERID(name)}" = "BILLINGS,MT "
- | "${CALLERID(name)}" = "PROVO,UT "
- | "${CALLERID(name)}" = "TOLL FREE " ) ) // put stuff in the above, that the phone company tends to put in your callerid,
+ | "${CALLERID(name)}" = "PROVO,UT "
+ | "${CALLERID(name)}" = "TOLL FREE " ) ) // put stuff in the above, that the phone company tends to put in your callerid,
// that you would rather override with DB info
// there's no way to guess them all, but you can get the most popular ones...
// why cell phones can't do CID like everybody else, ....?
- {
+ {
Set(CALLERID(name)=${cidn}); // Override what the phone company provides with what's in the DB for this number.
}
}
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
{
BackGround(try_cell);
- CALLERID(num)=${cidnu}; // put the original number back
+ CALLERID(num)=${cidnu}; // put the original number back
Dial(Zap/2/${lookup},${waittime},${dialopts});
}
}
Dial(SIP/1${lookup}@tctwest,${waittime},${dialopts});
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
{
- Set(CALLERID(num)=${cidnu}); // put the original number back
+ Set(CALLERID(num)=${cidnu}); // put the original number back
BackGround(try_zap);
Dial(${ddev}/${dialnum},${waittime}|${dialopts});
if( "${DIALSTATUS}" = "CHANUNAVAIL" )
macro callerid-liar()
{
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/priv-callerintros/LIAR.gsm&);
- Background(priv-liar); // Script: OOOps! Sorry! I don't allow men with ski masks pulled over their
+ Background(priv-liar); // Script: OOOps! Sorry! I don't allow men with ski masks pulled over their
// faces to get in the front door, and unidentified callers won't fair
// any better. You entered *MY* phone number. That won't work.
// If you are telemarketing, cross me off the list, and don't call again.
// If you did this by mistake, forgive my defenses, and call again.
// Alternate: (priv-liar2)
// Script: You have chosen to try to deceive my system and withold your CallerID,
- // by entering my own phone number as YOUR CallerID. I find this
+ // by entering my own phone number as YOUR CallerID. I find this
// offensive because you are being dishonest. I will not do business nor
// waste my time talking to anyone who is less than honest and forthcoming.
// Take me off your call list and do not call me again.
context privacyManagerFailed {
s => {
begin:
- Background(PrivManInstructions); // Script: OOps, that didn't go well. You need to enter *your* area code, and *your* 7 digit
+ Background(PrivManInstructions); // Script: OOps, that didn't go well. You need to enter *your* area code, and *your* 7 digit
// phone number, for a total of 10 digits, or you'll be handed over to the monkeys. Let's
// try this again, and hopefully you can get past our front-line defenses!
PrivacyManager();
}
}
loopback:
- ifTime(*|*|20-25|dec)
- {
- Playback(greetings/christmas);
+ ifTime(*|*|20-25|dec)
+ {
+ Playback(greetings/christmas);
}
- else ifTime(*|*|31|dec)
- {
- Playback(greetings/newyear);
+ else ifTime(*|*|31|dec)
+ {
+ Playback(greetings/newyear);
}
else ifTime(*|*|1|jan)
{
{
Playback(greetings/valentines);
}
- else ifTime(*|*|17|mar)
+ else ifTime(*|*|17|mar)
{
Playback(greetings/stPat);
}
- else ifTime(*|*|31|oct)
+ else ifTime(*|*|31|oct)
{
Playback(greetings/halloween);
}
- else ifTime(*|mon|15-21|jan)
+ else ifTime(*|mon|15-21|jan)
{
Playback(greetings/mlkDay);
}
else ifTime(*|sun|15-21|jun)
{
Playback(greetings/fathers);
- }
- else
+ }
+ else
{
Playback(greetings/hello); // None of the above? Just a plain hello will do
- }
+ }
Background(murphy-homeline-intro1); // Script: Hello-- Welcome to the Murphy's! If you already know what
// option you want, you don't have to wait for this entire spiel-- just
// have at it.
// to play with your introduction, dial 5.
// If we don't seem to be giving you the time of day, try 7.
// Have a good day!
-
+
}
1 => { // Sonya
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
&std-priv-exten(Zap/6r3&Sip/murf,1,25,mpA(beep)tw,telemarket,telemarket);
goto s|loopback;
}
- 4 => { // Voicemail
+ 4 => { // Voicemail
VoicemailMain();
goto s|loopback;
}
begin:
Background(intro-record-choices); // Script:
// If you want some advice about recording your
- // introduction, dial 1.
+ // introduction, dial 1.
// otherwise, dial 2, and introduce yourself after
// the beep.
}
// This is NOT meant to be a voice mail message, so
// please, don't say anything about why you are calling.
// After we are done making the recording, your introduction
- // will be saved for playback.
- // If you are the only person that would call from this number,
+ // will be saved for playback.
+ // If you are the only person that would call from this number,
// please state your name. Otherwise, state your business
- // or residence name instead. For instance, if you are
+ // or residence name instead. For instance, if you are
// friend of the family, say, Olie McPherson, and both
// you and your kids might call here a lot, you might
// say: "This is the distinguished Olie McPherson Residence!"
// "John, from the Park County Morgue. You stab 'em, we slab 'em!".
// Just one caution: the kids will hear what you record every time
// you call. So watch your language!
- // I will begin recording after the tone.
- // When you are done, hit the # key. Gather your thoughts and get
+ // I will begin recording after the tone.
+ // When you are done, hit the # key. Gather your thoughts and get
// ready. Remember, the # key will end the recording, and play back
// your intro. Good Luck, and Thank you!"
goto 2|begin;
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/4/greet.wav&);
Voicemail(u4);
goto homeline|s|loopback;
-
+
// SetMusicOnHold(erics);
// TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
// TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/4/greet.wav&);
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/7/greet.wav&);
&std-priv-exten(Zap/3r2&Zap/5r2,7,35,mtw,telemarket,telemarket);
goto homeline|s|loopback;
-
+
}
6 => {
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
1 => {
TrySystem(/usr/bin/play /var/lib/asterisk/sounds/call-for.gsm);
TrySystem(/usr/bin/play /var/spool/asterisk/voicemail/default/1/greet.wav&);
-
+
&std-priv-exten(Zap/6&Sip/murf,1,30,mtw,telemarket,telemarket);
- goto s|loopback;
+ goto s|loopback;
}
4 => {
- VoicemailMain();
+ VoicemailMain();
goto s|loopback;
}
6 => {
Hangup();
}
i => {
- Background(invalid);
+ Background(invalid);
goto s|loopback;
}
o => {
Wait(2);
Playtones(info);
Wait(5);
- Hangup();
+ Hangup();
}
790 => {
MeetMe(790,p);
// now include the telemarketer torture scripts!
#include "telemarket_torture.ael2"
-
-
// WORSE DESIGN: Instead of using the Background application, the Playback
// application is used. After taking so much time and trouble
-// to record this material, the caller must listen and enjoy
+// to record this material, the caller must listen and enjoy
// every syllable before they can make an option choice. None
// of that interrupting with a choice. We want them to savour
// every word!
context telemarket {
s => {
begin:
- Playback(telemarketer-intro); // ; Script:
+ Playback(telemarketer-intro); // ; Script:
// Due to the extremely high volume of calls from everything from telemarketers
// to Septic System Bacteria vendors, we are asking all such organizations
// to remove this number from their call list, or as need be, to add this
- // number to their No-Call list, whichever is relevent.
+ // number to their No-Call list, whichever is relevent.
// [THE CARROT:]
// We HAVE made some exceptions, and if you wish to see if your organization
// has been exempted, please listen to and follow the following prompts.
- //
+ //
// Otherwise, please Cease calling this number!
- //
+ //
Playback(telemarketer-choices);
// if you represent a charitable organization, please dial 1,
// if you represent a political organization, please dial 2.
// have sold our name and phone number to each other until we are now hounded
// day and night by literally hundreds of such organizations.
// Enough is Enough!
- //
- // If we have contributed to your cause in the past, we may, perhaps, be disposed to
+ //
+ // If we have contributed to your cause in the past, we may, perhaps, be disposed to
// do so in the future, at our option,
// we give no pledges nor make any commitments here.
// Send us material via the post if you feel this necessary
// but do not even consider email. Any email or further phone calls from your organization
- // in the future, will be considered an act of aggression, and we will
+ // in the future, will be considered an act of aggression, and we will
// blacklist your organization for the rest of our natural lives.
- //
+ //
// To see if your organization is exempt from these prohibitions, please
// comply with the following options.
Playback(telemark-charity-choices);
// If your organization is disease or genetic defect related, dial 1,
// If your organization is handicap related, dial 2.
// If your organization is a police or fireman or other similar support entity, please dial 3.
- // If your organization is a grade school to high school related
+ // If your organization is a grade school to high school related
// fund raiser or other type of activity, please dial 4.
// If your organization is a college or univerity or alumnis organization, please dial 5.
// If your organization is animal rights or ecology related organization, please dial 6.
context telemarket-sorry {
s => {
begin:
- Playback(telemarket-sorry);
+ Playback(telemarket-sorry);
// Sorry -- your organization is not exempt. Please stop calling us.
// Thank you. goodbye.
Hangup();
s => {
begin:
Playback(telemarket-success);
- // Congratulations. Your organization IS exempt. Please call us back,
+ // Congratulations. Your organization IS exempt. Please call us back,
// but this time, just act like a normal caller. Thank you. Goodbye.
Hangup();
}
Playback(telemark-politx-intro);
// Thank you for your patience, and I congratulate you for your persistence.
// Just a few more options!
- //
+ //
Playback(telemark-polit2-choices);
// if You represent the Communist Party USA, dial 1.
// if You represent the Constitution Party, dial 2.
s => {
begin:
Playback(telemark-poll-intro);
- // I'm sorry-- We are just not available for doing any polling at the moment. So,
+ // I'm sorry-- We are just not available for doing any polling at the moment. So,
// please remove us from your list.
goto telemarket-sorry|s|begin;
}
Playback(telemark-research-intro);
// I'd like to say I'd love to help you with your market survey, but that would be a complete
// and total lie. I am not interested in helping you with Market Surveys.
- //
+ //
// Please remove me from your call list. It just doesn't pay enough. But Thank you.
goto telemarket-sorry|s|begin;
}
s => {
begin:
Playback(telemark-mag-choices);
- // If you are calling to see if I would like a NEW free subscription
+ // If you are calling to see if I would like a NEW free subscription
// to your magazine or newsletter, please dial 1.
// If you are calling to see if I want to Renew an existing subscription, please dial 2.
// If you are representing some publisher, and want my opinion about something, or are doing
// some kind of survey, please dial 3.
- // If you are calling to verify that some previous caller actually called me, and the
+ // If you are calling to verify that some previous caller actually called me, and the
// verification information is correct, please dial 4.
// and if your call purpose doesn't match any of the above, please dial 5.
}
s => {
begin:
Playback(telemark-mag-new);
- // I'm sorry, I'm maxed out, and the answer is NO.
- // If you really think I'd LOVE to add your publication to the pile I already get,
+ // I'm sorry, I'm maxed out, and the answer is NO.
+ // If you really think I'd LOVE to add your publication to the pile I already get,
// Send something via the post. Don't call me.
// Thank you. bye.
Hangup();
begin:
Playback(telemark-mag-renew);
// So, you want to see if I want to Renew, do you? The answer is most likely "YES".
- //
- // But, I will not answer a long list of questions over the phone. Send such
- // categorization info via the post, and stop bothering me over the phone,
+ //
+ // But, I will not answer a long list of questions over the phone. Send such
+ // categorization info via the post, and stop bothering me over the phone,
// if this is what you want.
// Do you need verification information? Normally I opt out of such nonsense, if possible.
// If not, use whatever of the following you can:
begin:
Playback(telemark-mag-verify);
// If you are calling to verify that your own agents aren't ripping you off,
- // sorry, I can't help you. I opt out whenever I can, mainly because I'm not
+ // sorry, I can't help you. I opt out whenever I can, mainly because I'm not
// paid enough for this kind of thing. I always lie, and I can't remember
// what I might have said. Sorry. Goodbye.
Hangup();
begin:
Playback(telemark-comm-intro); // Script: Please leave your name, organization, and phone number, plus
// a short description of the purpose of your call, at the prompt.
- // We will do our best to respond to your call! And, in the mean time,
+ // We will do our best to respond to your call! And, in the mean time,
// do not forget to add us to your no-call list!
Voicemail(u82);
goto telemarket-sorry|s|begin;
begin:
Playback(telemark-other-intro);
// Please review the previous menu options, and see if you really don't
- // fit in one of the previous categories.
+ // fit in one of the previous categories.
// If you do not, go ahead, and call me again, and let me know what category
// I should have included in the above list. I appreciate this. Thank you much!
Hangup();
context dialextens
{
- /*
+ /*
101 thru 123, 149 thru 152
*/
_10X => Dial(Zap/${EXTEN:2},30,tw);
_1ZX => Dial(Zap/${EXTEN:1},30,tw);
}
-/*
+/*
Due to extenal wiring:
dialing 125 will ring 101
Verbose(Finished 100000 levels deep call!);
}
83 => {
- switch (${EXTEN})
+ switch (${EXTEN})
{
pattern 8X:
Verbose(do something to prepare it);
for i in ael-vtest*; do
echo -n Test: $i.................
(cd $i; ../../../../utils/aelparse -d -w -n | grep -v -i 'seconds' > ../res2.$i)
-
+
if (diff -q ref.$i $i/extensions.conf.aeldump > /dev/null 2>&1 ) then
echo PASSED
rm res2.$i
}
static char *proto2str(int proto, char *buf, int bufsiz)
-{
+{
switch(proto) {
case DUNDI_PROTO_NONE:
strncpy(buf, "None", bufsiz - 1);
tmp[datalen] = '\0';
ast_eid_to_str(eid_str, sizeof(eid_str), &answer->eid);
- snprintf(output, maxlen, "[%s] %d <%s/%s> from [%s]",
- dundi_flags2str(flags, sizeof(flags), ntohs(answer->flags)),
+ snprintf(output, maxlen, "[%s] %d <%s/%s> from [%s]",
+ dundi_flags2str(flags, sizeof(flags), ntohs(answer->flags)),
ntohs(answer->weight),
- proto2str(answer->protocol, proto, sizeof(proto)),
+ proto2str(answer->protocol, proto, sizeof(proto)),
tmp, eid_str);
}
}
snprintf(subclass2, (int)sizeof(subclass2), "%02hhx", (unsigned char)fhi->cmdflags);
subclass = subclass2;
- snprintf(tmp, (int)sizeof(tmp),
+ snprintf(tmp, (int)sizeof(tmp),
"%s-Frame -- OSeqno: %3.3d ISeqno: %3.3d Type: %s (%s)\n",
pref[rx],
fhi->oseqno, fhi->iseqno, class, fhi->cmdresp & 0x40 ? "Response" : "Command");
outputf(tmp);
- snprintf(tmp, (int)sizeof(tmp),
+ snprintf(tmp, (int)sizeof(tmp),
"%s Flags: %s STrans: %5.5d DTrans: %5.5d [%s:%d]%s\n", (rx > 1) ? " " : "",
subclass, ntohs(fhi->strans) & ~DUNDI_FLAG_RESERVED, ntohs(fhi->dtrans) & ~DUNDI_FLAG_RETRANS,
ast_inet_ntoa(sin->sin_addr), ntohs(sin->sin_port),
return dundi_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in));
}
-int dundi_ie_append_int(struct dundi_ie_data *ied, unsigned char ie, unsigned int value)
+int dundi_ie_append_int(struct dundi_ie_data *ied, unsigned char ie, unsigned int value)
{
unsigned int newval;
newval = htonl(value);
return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
}
-int dundi_ie_append_short(struct dundi_ie_data *ied, unsigned char ie, unsigned short value)
+int dundi_ie_append_short(struct dundi_ie_data *ied, unsigned char ie, unsigned short value)
{
unsigned short newval;
newval = htons(value);
return dundi_ie_append_raw(ied, ie, &dat, 1);
}
-int dundi_ie_append(struct dundi_ie_data *ied, unsigned char ie)
+int dundi_ie_append(struct dundi_ie_data *ied, unsigned char ie)
{
return dundi_ie_append_raw(ied, ie, NULL, 0);
}
} else {
if (ies->anscount < DUNDI_MAX_ANSWERS)
ies->answers[ies->anscount++]= (struct dundi_answer *)(data + 2);
- else
+ else
errorf("Ignoring extra answers!\n");
}
break;
-/*
+/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2006, Digium, Inc.
/*! \file
*
* \brief Compile symbolic Asterisk Extension Logic into Asterisk extensions, version 2.
- *
+ *
*/
/*** MODULEINFO
#ifndef AAL_ARGCHECK
/* for the time being, short circuit all the AAL related structures
- without permanently removing the code; after/during the AAL
- development, this code can be properly re-instated
+ without permanently removing the code; after/during the AAL
+ development, this code can be properly re-instated
*/
#endif
char *rfilename;
struct ast_context *local_contexts=NULL, *con;
struct ast_hashtab *local_table=NULL;
-
+
struct pval *parse_tree;
ast_debug(1, "Starting AEL load process.\n");
ast_log(LOG_NOTICE, "File %s not found; AEL declining load\n", rfilename);
return AST_MODULE_LOAD_DECLINE;
}
-
+
parse_tree = ael2_parse(rfilename, &errs);
ast_debug(1, "AEL load process: parsed config file name '%s'.\n", rfilename);
ael2_semantic_check(parse_tree, &sem_err, &sem_warn, &sem_note);
return AST_MODULE_LOAD_DECLINE;
}
ast_debug(1, "AEL load process: compiled config file name '%s'.\n", rfilename);
-
+
ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
local_table = NULL; /* it's the dialplan global now */
local_contexts = NULL;
return AST_MODULE_LOAD_DECLINE;
}
destroy_pval(parse_tree); /* free up the memory */
-
+
return AST_MODULE_LOAD_SUCCESS;
}
int s,t;
t = sizeof(ael_funclist)/sizeof(char*);
s = 0;
- while ((s < t) && strcasecmp(name, ael_funclist[s]))
+ while ((s < t) && strcasecmp(name, ael_funclist[s]))
s++;
if ( s < t )
return 1;
else
return 0;
}
-#endif
+#endif
*
* \brief Populate and remember extensions from static config file
*
- *
+ *
*/
/*** MODULEINFO
return res;
} else if (a->pos == 5) { /* "dialplan remove include CTX from _X_" */
/*
- * Context from which we removing include ...
+ * Context from which we removing include ...
*/
char *context, *dupline, *from;
const char *s = skip_words(a->line, 3); /* skip 'dialplan' 'remove' 'include' */
const char *c_name = ast_get_context_name(c);
if (!partial_match(c_name, a->word, len)) /* not a good target */
continue;
- /* walk through all includes and check if it is our context */
+ /* walk through all includes and check if it is our context */
if (lookup_ci(c, context) && ++which > a->n)
res = strdup(c_name);
}
else
ast_cli(a->fd, "Extension %s@%s with priority %d removed\n",
exten, context, removing_priority);
-
+
ret = CLI_SUCCESS;
} else {
if (cid) {
error3:
free(exten);
}
- return ret;
+ return ret;
}
/*!
}
ast_config_destroy(cfg);
-
+
#define PUT_CTX_HDR do { \
if (!context_header_written) { \
fprintf(output, "[%s]\n", ast_get_context_name(c)); \
struct ast_ignorepat *ip;
struct ast_sw *sw;
- /* try to lock context and fireout all info */
+ /* try to lock context and fireout all info */
if (ast_rdlock_context(c)) { /* lock failure */
incomplete = 1;
continue;
while ( (p = ast_walk_extension_priorities(ext, p)) ) {
if (strcmp(ast_get_extension_registrar(p), registrar) != 0) /* not this source */
continue;
-
- /* make empty line between different extensions */
+
+ /* make empty line between different extensions */
if (last_written_e != NULL &&
strcmp(ast_get_extension_name(last_written_e),
ast_get_extension_name(p)))
fprintf(output, "\n");
last_written_e = p;
-
+
PUT_CTX_HDR;
if (ast_get_extension_priority(p) == PRIORITY_HINT) { /* easy */
}
ast_unlock_context(c);
- }
+ }
ast_unlock_contexts();
ast_mutex_unlock(&save_dialplan_lock);
if (ast_rdlock_context(c)) /* error, skip it */
continue;
-
+
for (ip = NULL; !ret && (ip = ast_walk_context_ignorepats(c, ip));) {
if (partial_match(ast_get_ignorepat_name(ip), a->word, len) && ++which > a->n) {
/* n-th match */
}
ast_copy_string(userscontext, ast_variable_retrieve(cfg, "general", "userscontext") ?: "default", sizeof(userscontext));
-
+
for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
pbx_builtin_setvar_helper(NULL, v->name, realvalue);
} else if (!strcasecmp(v->name, "switch") || !strcasecmp(v->name, "lswitch") || !strcasecmp(v->name, "eswitch")) {
char *appl, *data;
stringp = realvalue;
-
+
if (!strcasecmp(v->name, "switch")) {
pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
} else {
int start, finish, x;
struct ast_context *con = NULL;
struct ast_flags config_flags = { 0 };
-
+
cfg = ast_config_load("users.conf", config_flags);
if (!cfg)
return;
ast_mutex_unlock(&reload_lock);
return AST_MODULE_LOAD_DECLINE;
}
-
+
pbx_load_users();
ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
in the DUNDi lookup. If no results were found, the result will be blank.</para>
</description>
</function>
-
-
+
+
<function name="DUNDIQUERY" language="en_US">
<synopsis>
Initiate a DUNDi query.
if (map->weightstr) {
if (headp) {
pbx_substitute_variables_varshead(headp, map->weightstr, buf, sizeof(buf) - 1);
- } else {
+ } else {
pbx_substitute_variables_helper(NULL, map->weightstr, buf, sizeof(buf) - 1);
}
.reload = reload,
.nonoptreq = "res_crypto",
);
-
* at the top of the source tree.
*/
-/*!
+/*!
* \file
*
* \author Matthew Nicholson <mnicholson@digium.com>
static int lua_pbx_findapp(lua_State *L)
{
const char *app_name = luaL_checkstring(L, 2);
-
+
lua_newtable(L);
lua_pushstring(L, "name");
lua_getfield(L, 1, "name");
app_name = ast_strdupa(lua_tostring(L, -1));
lua_pop(L, 1);
-
+
if (!(app = pbx_findapp(app_name))) {
lua_pushstring(L, "application '");
lua_pushstring(L, app_name);
lua_concat(L, 3);
return lua_error(L);
}
-
+
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
chan = lua_touserdata(L, -1);
lua_pop(L, 1);
-
+
context = ast_strdupa(ast_channel_context(chan));
exten = ast_strdupa(ast_channel_exten(chan));
priority = ast_channel_priority(chan);
-
+
lua_concat_args(L, 2, nargs);
data = lua_tostring(L, -1);
/* goto detected - construct error message */
lua_insert(L, -3);
-
- lua_pushliteral(L, " changed from ");
- lua_insert(L, -3);
-
- lua_pushliteral(L, " to ");
- lua_insert(L, -2);
-
- lua_concat(L, 5);
-
- ast_debug(2, "Goto detected: %s\n", lua_tostring(L, -1));
- lua_pop(L, 1);
-
- /* let the lua engine know it needs to return control to the pbx */
- lua_pushinteger(L, LUA_GOTO_DETECTED);
+
+ lua_pushliteral(L, " changed from ");
+ lua_insert(L, -3);
+
+ lua_pushliteral(L, " to ");
+ lua_insert(L, -2);
+
+ lua_concat(L, 5);
+
+ ast_debug(2, "Goto detected: %s\n", lua_tostring(L, -1));
+ lua_pop(L, 1);
+
+ /* let the lua engine know it needs to return control to the pbx */
+ lua_pushinteger(L, LUA_GOTO_DETECTED);
lua_error(L);
return 0;
lua_pushstring(L, "User probably used '.' instead of ':' for retrieving a channel variable value");
return lua_error(L);
}
-
+
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
chan = lua_touserdata(L, -1);
lua_pop(L, 1);
lua_getfield(L, 1, "name");
name = ast_strdupa(lua_tostring(L, -1));
lua_pop(L, 1);
-
+
lua_getfield(L, LUA_REGISTRYINDEX, "autoservice");
autoservice = lua_toboolean(L, -1);
lua_pop(L, 1);
if (autoservice)
ast_autoservice_stop(chan);
-
+
/* if this is a dialplan function then use ast_func_read(), otherwise
* use pbx_retrieve_variable() */
if (!ast_strlen_zero(name) && name[strlen(name) - 1] == ')') {
} else {
pbx_retrieve_variable(chan, name, &value, workspace, LUA_BUF_SIZE, ast_channel_varshead(chan));
}
-
+
if (autoservice)
ast_autoservice_start(chan);
/*!
* \brief [lua_CFunction] Used to set the value of a variable or dialplan
* function (for access from lua, don't call directly)
- *
+ *
* This function is the 'set()' function in the following example as would be
* seen in extensions.lua.
*
lua_pop(L, 1);
value = luaL_checkstring(L, 2);
-
+
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
chan = lua_touserdata(L, -1);
lua_pop(L, 1);
ast_autoservice_stop(chan);
pbx_builtin_setvar_helper(chan, name, value);
-
+
if (autoservice)
ast_autoservice_start(chan);
lua_insert(L, -2); /* move the table after the name */
lua_setfield(L, -2, "name");
-
+
lua_pushcfunction(L, &lua_get_variable_value);
lua_setfield(L, -2, "get");
-
+
lua_pushcfunction(L, &lua_set_variable_value);
lua_setfield(L, -2, "set");
}
/*!
* \brief Create the 'application' metatable, used to execute asterisk
- * applications from lua
+ * applications from lua
*
* \param L the lua_State to use
*/
{
lua_pushcfunction(L, &lua_autoservice_start);
lua_setglobal(L, "autoservice_start");
-
+
lua_pushcfunction(L, &lua_autoservice_stop);
lua_setglobal(L, "autoservice_stop");
/*!
* \brief [lua_CFunction] Return a lua 'variable' object (for access from lua, don't call
* directly)
- *
+ *
* This function is called to lookup a variable construct a 'variable' object.
* It would be called in the following example as would be seen in
* extensions.lua.
char *value = NULL;
char *workspace = ast_alloca(LUA_BUF_SIZE);
workspace[0] = '\0';
-
+
lua_getfield(L, LUA_REGISTRYINDEX, "channel");
chan = lua_touserdata(L, -1);
lua_pop(L, 1);
lua_pushvalue(L, 2);
lua_push_variable_table(L);
-
+
/* if this is not a request for a dialplan funciton attempt to retrieve
* the value of the variable */
if (!ast_strlen_zero(name) && name[strlen(name) - 1] != ')') {
lua_setfield(L, -2, "value");
}
- return 1;
+ return 1;
}
/*!
* \brief [lua_CFunction] Set the value of a channel variable or dialplan
* function (for access from lua, don't call directly)
- *
+ *
* This function is called to set a variable or dialplan function. It would be
* called in the following example as would be seen in extensions.lua.
*
ast_autoservice_stop(chan);
pbx_builtin_setvar_helper(chan, name, value);
-
+
if (autoservice)
ast_autoservice_start(chan);
/*!
* \brief [lua_CFunction] Create a 'variable' object for accessing a dialplan
* function (for access from lua, don't call directly)
- *
+ *
* This function is called to create a 'variable' object to access a dialplan
* function. It would be called in the following example as would be seen in
* extensions.lua.
/*!
* \brief Store the sort order of each context
-
+
* In the event of an error, an error string will be pushed onto the lua stack.
*
* \retval 0 success
return 1;
}
}
-
+
/* remove the extensions table and the extensions_order table */
lua_pop(L, 2);
return 0;
return 1;
}
}
-
+
/* remove the extensions table */
lua_pop(L, 1);
return 0;
*/
static int lua_load_extensions(lua_State *L, struct ast_channel *chan)
{
-
+
/* store a pointer to this channel */
lua_pushlightuserdata(L, chan);
lua_setfield(L, LUA_REGISTRYINDEX, "channel");
-
+
luaL_openlibs(L);
/* load and sort extensions */
config_file_data = data;
config_file_size = size;
-
+
/* merge our new contexts */
ast_merge_contexts_and_delete(&local_contexts, local_table, registrar);
- /* merge_contexts_and_delete will actually, at the correct moment,
+ /* merge_contexts_and_delete will actually, at the correct moment,
set the global dialplan pointers to your local_contexts and local_table.
It then will free up the old tables itself. Just be sure not to
hang onto the pointers. */
ast_module_user_remove(u);
return 0;
}
-
+
res = lua_find_extension(L, context, exten, priority, &matchmore, 0);
if (!chan) lua_close(L);
ast_log(LOG_ERROR, "Error adjusting use count, probably could not allocate memory\n");
return -1;
}
-
+
L = lua_get_state(chan);
if (!L) {
ast_module_user_remove(u);
lua_pop(L, 1);
lua_update_registry(L, context, exten, priority);
-
+
lua_pushstring(L, context);
lua_pushstring(L, exten);
-
+
res = lua_pcall(L, 2, 0, error_func);
if (res) {
if (res == LUA_ERRRUN) {
.unload = unload_module,
.reload = reload,
);
-
[context@][realtimetable][/options]
- If the realtimetable is omitted it is assumed to be "extensions". If no context is
+ If the realtimetable is omitted it is assumed to be "extensions". If no context is
specified the context is assumed to be whatever is the container.
The realtime table should have entries for context,exten,priority,app,args
-
+
The realtime table currently does not support callerid fields.
*/
}
var = ast_load_realtime(table, ematch, rexten, "context", context, "priority", pri, SENTINEL);
if (!var && !ast_test_flag(&flags, OPTION_PATTERNS_DISABLED)) {
- cfg = ast_load_realtime_multientry(table, "exten LIKE", "\\_%", "context", context, "priority", pri, SENTINEL);
+ cfg = ast_load_realtime_multientry(table, "exten LIKE", "\\_%", "context", context, "priority", pri, SENTINEL);
if (cfg) {
char *cat = NULL;
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Realtime Switch");
-
/*! \file
*
* \brief Full-featured outgoing call spool support
- *
+ *
*/
/*** MODULEINFO
/*
* pbx_spool is similar in spirit to qcall, but with substantially enhanced functionality...
- * The spool file contains a header
+ * The spool file contains a header
*/
enum {
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for resource modules
#
# Copyright (C) 1999-2006, Digium, Inc.
[ ]+ { my_col += yyleng; }
[\t]+ { my_col += (yyleng*8)-(my_col%8); }
-({KEYWORD}?[-a-zA-Z0-9'"_/.\<\>\*\+!$#\[\]]|{HIBIT}|(\\.)|(\$\{)|(\$\[)) {
- /* boy did I open a can of worms when I changed the lexical token "word".
+({KEYWORD}?[-a-zA-Z0-9'"_/.\<\>\*\+!$#\[\]]|{HIBIT}|(\\.)|(\$\{)|(\$\[)) {
+ /* boy did I open a can of worms when I changed the lexical token "word".
all the above keywords can be used as a beginning to a "word".-
- before, a "word" would match a longer sequence than the above
- keywords, and all would be well. But now "word" is a single char
+ before, a "word" would match a longer sequence than the above
+ keywords, and all would be well. But now "word" is a single char
and feeds into a statemachine sort of sequence from there on. So...
I added the {KEYWORD}? to the beginning of the word match sequence */
}
}
-<curlystate>{NOPARENS}[\(\[\{] {
+<curlystate>{NOPARENS}[\(\[\{] {
char c = yytext[yyleng-1];
if (c == '{')
parencount2++;
yymore();
}
-<curlystate>{NOPARENS}[\]\)] {
+<curlystate>{NOPARENS}[\]\)] {
char c = yytext[yyleng-1];
if ( pbcpop2(c)) { /* error */
STORE_LOC;
}
}
-<brackstate>{NOPARENS}[\(\[\{] {
+<brackstate>{NOPARENS}[\(\[\{] {
char c = yytext[yyleng-1];
if (c == '[')
parencount3++;
yymore();
}
-<brackstate>{NOPARENS}[\}\)] {
+<brackstate>{NOPARENS}[\}\)] {
char c = yytext[yyleng-1];
if ( pbcpop3(c)) { /* error */
STORE_LOC;
glob_t globbuf; /* the current globbuf */
int globbuf_pos = -1; /* where we are in the current globbuf */
globbuf.gl_offs = 0; /* initialize it to silence gcc */
-
+
p1 = strchr(yytext,'"');
p2 = strrchr(yytext,'"');
if ( include_stack_index >= MAX_INCLUDE_DEPTH ) {
yy_delete_buffer( YY_CURRENT_BUFFER, yyscanner );
include_stack[include_stack_index-1].globbuf_pos++;
setup_filestack(fnamebuf, sizeof(fnamebuf), &include_stack[include_stack_index-1].globbuf, include_stack[include_stack_index-1].globbuf_pos, yyscanner, 0);
- /* finish this */
-
+ /* finish this */
+
} else {
if (include_stack[include_stack_index].fname) {
free(include_stack[include_stack_index].fname);
} else {
globfree(&include_stack[include_stack_index].globbuf);
include_stack[include_stack_index].globbuf_pos = -1;
-
+
yy_delete_buffer( YY_CURRENT_BUFFER, yyscanner );
yy_switch_to_buffer(include_stack[include_stack_index].bufstate, yyscanner );
my_lineno = include_stack[include_stack_index].lineno;
buffer = (char*)malloc(stats.st_size+2);
if (fread(buffer, 1, stats.st_size, fin) != stats.st_size) {
ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
+ }
buffer[stats.st_size]=0;
fclose(fin);
buffer = (char*)malloc(stats.st_size+1);
if (fread(buffer, 1, stats.st_size, in1) != stats.st_size) {
ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
+ }
buffer[stats.st_size] = 0;
ast_debug(1, " --Read in included file %s, %d chars\n",fnamebuf2, (int)stats.st_size);
fclose(in1);
/* A Bison parser, made by GNU Bison 2.5. */
/* Bison implementation for Yacc-like parsers in C
-
+
Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-
+
This program 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 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but 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, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
void reset_parencount(yyscan_t yyscanner);
void reset_semicount(yyscan_t yyscanner);
void reset_argcount(yyscan_t yyscanner );
-
+
#define YYLEX_PARAM ((struct parse_io *)parseio)->scanner
#define YYERROR_VERBOSE 1
free((yyvsp[(1) - (2)].str));
free((yyvsp[(2) - (2)].str));
prev_word = (yyval.str);
- }
+ }
}
break;
static void set_dads(struct pval *dad, struct pval *child_list)
{
struct pval *t;
-
+
for(t=child_list;t;t=t->next) /* simple stuff */
t->dad = dad;
}
-
-
/* A Bison parser, made by GNU Bison 2.5. */
/* Bison interface for Yacc-like parsers in C
-
+
Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-
+
This program 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 3 of the License, or
(at your option) any later version.
-
+
This program is distributed in the hope that it will be useful,
but 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, see <http://www.gnu.org/licenses/>. */
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
# define YYLTYPE_IS_DECLARED 1
# define YYLTYPE_IS_TRIVIAL 1
#endif
-
-
-
void reset_parencount(yyscan_t yyscanner);
void reset_semicount(yyscan_t yyscanner);
void reset_argcount(yyscan_t yyscanner );
-
+
#define YYLEX_PARAM ((struct parse_io *)parseio)->scanner
#define YYERROR_VERBOSE 1
$$->u1.str = $3;
$$->u2.statements = $5;
set_dads($$,$5);
- $$->u3.abstract = $1;}
+ $$->u3.abstract = $1;}
;
/* optional "abstract" keyword XXX there is no regression test for this */
free($1);
free($2);
prev_word = $$;
- }
+ }
}
| word word word {
if (asprintf(&($$), "%s%s%s", $1, $2, $3) < 0) {
opt_else : KW_ELSE statement { $$ = $2; }
| { $$ = NULL ; }
-
+
target : goto_word { $$ = nword($1, &@1); }
| goto_word BAR goto_word {
$$ = nword($1, &@1);
static void set_dads(struct pval *dad, struct pval *child_list)
{
struct pval *t;
-
+
for(t=child_list;t;t=t->next) /* simple stuff */
t->dad = dad;
}
-
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types.
*/
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#define EOB_ACT_LAST_MATCH 2
#define YY_LESS_LINENO(n)
-
+
/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
do \
int yy_bs_lineno; /**< The line count. */
int yy_bs_column; /**< The column count. */
-
+
/* Whether to try to fill the input buffer when we reach the
* end of it.
*/
/* This must go here because YYSTYPE and YYLTYPE are included
* from bison output in section 1.*/
# define yylval yyg->yylval_r
-
+
# define yylloc yyg->yylloc_r
-
+
int ael_yylex_init (yyscan_t* scanner);
int ael_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
void ael_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
YYLTYPE *ael_yyget_lloc (yyscan_t yyscanner );
-
+
void ael_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
#endif
static void yyunput (int c,char *buf_ptr ,yyscan_t yyscanner);
-
+
#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif
case 51:
YY_RULE_SETUP
#line 272 "ael.flex"
-{
- /* boy did I open a can of worms when I changed the lexical token "word".
+{
+ /* boy did I open a can of worms when I changed the lexical token "word".
all the above keywords can be used as a beginning to a "word".-
- before, a "word" would match a longer sequence than the above
- keywords, and all would be well. But now "word" is a single char
+ before, a "word" would match a longer sequence than the above
+ keywords, and all would be well. But now "word" is a single char
and feeds into a statemachine sort of sequence from there on. So...
I added the {KEYWORD}? to the beginning of the word match sequence */
/* rule 59 can match eol */
YY_RULE_SETUP
#line 347 "ael.flex"
-{
+{
char c = yytext[yyleng-1];
if (c == '{')
parencount2++;
/* rule 60 can match eol */
YY_RULE_SETUP
#line 355 "ael.flex"
-{
+{
char c = yytext[yyleng-1];
if ( pbcpop2(c)) { /* error */
STORE_LOC;
/* rule 62 can match eol */
YY_RULE_SETUP
#line 390 "ael.flex"
-{
+{
char c = yytext[yyleng-1];
if (c == '[')
parencount3++;
/* rule 63 can match eol */
YY_RULE_SETUP
#line 398 "ael.flex"
-{
+{
char c = yytext[yyleng-1];
if ( pbcpop3(c)) { /* error */
STORE_LOC;
glob_t globbuf; /* the current globbuf */
int globbuf_pos = -1; /* where we are in the current globbuf */
globbuf.gl_offs = 0; /* initialize it to silence gcc */
-
+
p1 = strchr(yytext,'"');
p2 = strrchr(yytext,'"');
if ( include_stack_index >= MAX_INCLUDE_DEPTH ) {
ael_yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner );
include_stack[include_stack_index-1].globbuf_pos++;
setup_filestack(fnamebuf, sizeof(fnamebuf), &include_stack[include_stack_index-1].globbuf, include_stack[include_stack_index-1].globbuf_pos, yyscanner, 0);
- /* finish this */
-
+ /* finish this */
+
} else {
if (include_stack[include_stack_index].fname) {
free(include_stack[include_stack_index].fname);
} else {
globfree(&include_stack[include_stack_index].globbuf);
include_stack[include_stack_index].globbuf_pos = -1;
-
+
ael_yy_delete_buffer(YY_CURRENT_BUFFER,yyscanner );
ael_yy_switch_to_buffer(include_stack[include_stack_index].bufstate,yyscanner );
my_lineno = include_stack[include_stack_index].lineno;
YY_BUFFER_STATE ael_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
b = (YY_BUFFER_STATE) ael_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in ael_yy_create_buffer()" );
#ifndef __cplusplus
extern int isatty (int );
#endif /* __cplusplus */
-
+
/* Initializes or reinitializes a buffer.
* This function is sometimes called more than once on the same buffer,
* such as during a ael_yyrestart() or at EOF.
}
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
+
errno = oerrno;
}
, yyscanner);
if ( ! yyg->yy_buffer_stack )
YY_FATAL_ERROR( "out of dynamic memory in ael_yyensure_buffer_stack()" );
-
+
memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
+
yyg->yy_buffer_stack_max = num_to_alloc;
yyg->yy_buffer_stack_top = 0;
return;
* @param base the character buffer
* @param size the size in bytes of the character buffer
* @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object.
*/
YY_BUFFER_STATE ael_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
{
YY_BUFFER_STATE b;
-
+
if ( size < 2 ||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
base[size-1] != YY_END_OF_BUFFER_CHAR )
*/
YY_BUFFER_STATE ael_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
{
-
+
return ael_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
}
char *buf;
yy_size_t n;
int i;
-
+
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
buf = (char *) ael_yyalloc(n ,yyscanner );
int ael_yyget_lineno (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yylineno;
}
int ael_yyget_column (yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+
if (! YY_CURRENT_BUFFER)
return 0;
-
+
return yycolumn;
}
/* lineno is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "ael_yyset_lineno called with no buffer" , yyscanner);
-
+ yy_fatal_error( "ael_yyset_lineno called with no buffer" , yyscanner);
+
yylineno = line_number;
}
/* column is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "ael_yyset_column called with no buffer" , yyscanner);
-
+ yy_fatal_error( "ael_yyset_column called with no buffer" , yyscanner);
+
yycolumn = column_no;
}
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
return yylloc;
}
-
+
void ael_yyset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner)
{
struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
yylloc = yylloc_param;
}
-
+
/* User-visible API */
/* ael_yylex_init is special because it creates the scanner itself, so it is
errno = EINVAL;
return 1;
}
-
+
*ptr_yy_globals = (yyscan_t) ael_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-
+
if (*ptr_yy_globals == NULL){
errno = ENOMEM;
return 1;
}
-
+
/* By setting to 0xAA, we expose bugs in
yy_init_globals. Leave at 0x00 for releases. */
memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
+
ael_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
+
return yy_init_globals ( *ptr_yy_globals );
}
buffer = (char*)malloc(stats.st_size+2);
if (fread(buffer, 1, stats.st_size, fin) != stats.st_size) {
ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
+ }
buffer[stats.st_size]=0;
fclose(fin);
buffer = (char*)malloc(stats.st_size+1);
if (fread(buffer, 1, stats.st_size, in1) != stats.st_size) {
ast_log(LOG_ERROR, "fread() failed: %s\n", strerror(errno));
- }
+ }
buffer[stats.st_size] = 0;
ast_debug(1, " --Read in included file %s, %d chars\n",fnamebuf2, (int)stats.st_size);
fclose(in1);
}
}
}
-
/*! \file
*
* \brief Compile symbolic Asterisk Extension Logic into Asterisk extensions, version 2.
- *
+ *
*/
/*** MODULEINFO
{
int i;
pval *lp;
-
+
for (i=0; i<depth; i++) {
fprintf(fin, "\t"); /* depth == indentation */
}
-
+
switch ( item->type ) {
case PV_WORD:
fprintf(fin,"%s;\n", item->u1.str); /* usually, words are encapsulated in something else */
break;
-
+
case PV_MACRO:
fprintf(fin,"macro %s(", item->u1.str);
for (lp=item->u2.arglist; lp; lp=lp->next) {
}
fprintf(fin,"};\n\n");
break;
-
+
case PV_CONTEXT:
if ( item->u3.abstract )
fprintf(fin,"abstract context %s {\n", item->u1.str);
}
fprintf(fin,"};\n\n");
break;
-
+
case PV_MACRO_CALL:
fprintf(fin,"&%s(", item->u1.str);
for (lp=item->u2.arglist; lp; lp=lp->next) {
}
fprintf(fin,");\n");
break;
-
+
case PV_APPLICATION_CALL:
fprintf(fin,"%s(", item->u1.str);
for (lp=item->u2.arglist; lp; lp=lp->next) {
}
fprintf(fin,");\n");
break;
-
+
case PV_CASE:
fprintf(fin,"case %s:\n", item->u1.str);
print_pval_list(fin,item->u2.statements, depth+1);
break;
-
+
case PV_PATTERN:
fprintf(fin,"pattern %s:\n", item->u1.str);
print_pval_list(fin,item->u2.statements, depth+1);
break;
-
+
case PV_DEFAULT:
fprintf(fin,"default:\n");
print_pval_list(fin,item->u2.statements, depth+1);
break;
-
+
case PV_CATCH:
fprintf(fin,"catch %s {\n", item->u1.str);
print_pval_list(fin,item->u2.statements, depth+1);
}
fprintf(fin,"};\n");
break;
-
+
case PV_SWITCHES:
fprintf(fin,"switches {\n");
print_pval_list(fin,item->u1.list,depth+1);
}
fprintf(fin,"};\n");
break;
-
+
case PV_ESWITCHES:
fprintf(fin,"eswitches {\n");
print_pval_list(fin,item->u1.list,depth+1);
}
fprintf(fin,"};\n");
break;
-
+
case PV_INCLUDES:
fprintf(fin,"includes {\n");
for (lp=item->u1.list; lp; lp=lp->next) {
}
fprintf(fin,"%s", lp->u1.str); /* usually, words are encapsulated in something else */
if (lp->u2.arglist)
- fprintf(fin,"|%s|%s|%s|%s",
+ fprintf(fin,"|%s|%s|%s|%s",
lp->u2.arglist->u1.str,
lp->u2.arglist->next->u1.str,
lp->u2.arglist->next->next->u1.str,
);
fprintf(fin,";\n"); /* usually, words are encapsulated in something else */
}
-
+
for (i=0; i<depth; i++) {
fprintf(fin,"\t"); /* depth == indentation */
}
fprintf(fin,"};\n");
break;
-
+
case PV_STATEMENTBLOCK:
fprintf(fin,"{\n");
print_pval_list(fin,item->u1.list, depth+1);
}
fprintf(fin,"}\n");
break;
-
+
case PV_VARDEC:
fprintf(fin,"%s=%s;\n", item->u1.str, item->u2.val);
break;
-
+
case PV_LOCALVARDEC:
fprintf(fin,"local %s=%s;\n", item->u1.str, item->u2.val);
break;
-
+
case PV_GOTO:
fprintf(fin,"goto %s", item->u1.list->u1.str);
if ( item->u1.list->next )
fprintf(fin,",%s", item->u1.list->next->next->u1.str);
fprintf(fin,"\n");
break;
-
+
case PV_LABEL:
fprintf(fin,"%s:\n", item->u1.str);
break;
-
+
case PV_FOR:
fprintf(fin,"for (%s; %s; %s)\n", item->u1.for_init, item->u2.for_test, item->u3.for_inc);
print_pval_list(fin,item->u4.for_statements,depth+1);
break;
-
+
case PV_WHILE:
fprintf(fin,"while (%s)\n", item->u1.str);
print_pval_list(fin,item->u2.statements,depth+1);
break;
-
+
case PV_BREAK:
fprintf(fin,"break;\n");
break;
-
+
case PV_RETURN:
fprintf(fin,"return;\n");
break;
-
+
case PV_CONTINUE:
fprintf(fin,"continue;\n");
break;
-
+
case PV_RANDOM:
case PV_IFTIME:
case PV_IF:
if ( item->type == PV_IFTIME ) {
-
- fprintf(fin,"ifTime ( %s|%s|%s|%s )\n",
- item->u1.list->u1.str,
- item->u1.list->next->u1.str,
- item->u1.list->next->next->u1.str,
+
+ fprintf(fin,"ifTime ( %s|%s|%s|%s )\n",
+ item->u1.list->u1.str,
+ item->u1.list->next->u1.str,
+ item->u1.list->next->next->u1.str,
item->u1.list->next->next->next->u1.str
);
} else if ( item->type == PV_RANDOM ) {
print_pval_list(fin,item->u3.else_statements, depth);
}
break;
-
+
case PV_SWITCH:
fprintf(fin,"switch( %s ) {\n", item->u1.str);
print_pval_list(fin,item->u2.statements,depth+1);
}
fprintf(fin,"}\n");
break;
-
+
case PV_EXTENSION:
if ( item->u4.regexten )
fprintf(fin, "regexten ");
if ( item->u3.hints )
fprintf(fin,"hints(%s) ", item->u3.hints);
-
+
fprintf(fin,"%s => ", item->u1.str);
print_pval_list(fin,item->u2.statements,depth+1);
fprintf(fin,"\n");
break;
-
+
case PV_IGNOREPAT:
fprintf(fin,"ignorepat => %s;\n", item->u1.str);
break;
-
+
case PV_GLOBALS:
fprintf(fin,"globals {\n");
print_pval_list(fin,item->u1.statements,depth+1);
static void print_pval_list(FILE *fin, pval *item, int depth)
{
pval *i;
-
+
for (i=item; i; i=i->next) {
print_pval(fin, i, depth);
}
but you may not need it */
{
pval *lp;
-
+
switch ( item->type ) {
case PV_WORD:
/* fields: item->u1.str == string associated with this (word). */
break;
-
+
case PV_MACRO:
/* fields: item->u1.str == name of macro
item->u2.arglist == pval list of PV_WORD arguments of macro, as given by user
item->u3.macro_statements == pval list of statements in macro body.
*/
for (lp=item->u2.arglist; lp; lp=lp->next) {
-
+
}
traverse_pval_item_template(item->u3.macro_statements,depth+1);
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_MACRO_CALL:
/* fields: item->u1.str == name of macro to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
for (lp=item->u2.arglist; lp; lp=lp->next) {
}
break;
-
+
case PV_APPLICATION_CALL:
/* fields: item->u1.str == name of application to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
for (lp=item->u2.arglist; lp; lp=lp->next) {
}
break;
-
+
case PV_CASE:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_SWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
traverse_pval_item_template(item->u1.list,depth+1);
break;
-
+
case PV_ESWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
traverse_pval_item_template(item->u1.list,depth+1);
break;
-
+
case PV_INCLUDES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
item->u2.arglist == pval list of 4 PV_WORD elements for time values
traverse_pval_item_template(item->u1.list,depth+1);
traverse_pval_item_template(item->u2.arglist,depth+1);
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
traverse_pval_item_template(item->u1.list,depth+1);
break;
-
+
case PV_LOCALVARDEC:
case PV_VARDEC:
/* fields: item->u1.str == variable name
item->u2.val == variable value to assign
*/
break;
-
+
case PV_GOTO:
/* fields: item->u1.list == pval list of PV_WORD target names, up to 3, in order as given by user.
item->u1.list->u1.str == where the data on a PV_WORD will always be.
*/
-
+
if ( item->u1.list->next )
;
if ( item->u1.list->next && item->u1.list->next->next )
;
-
+
break;
-
+
case PV_LABEL:
/* fields: item->u1.str == label name
*/
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
*/
traverse_pval_item_template(item->u4.for_statements,depth+1);
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_BREAK:
/* fields: none
*/
break;
-
+
case PV_RETURN:
/* fields: none
*/
break;
-
+
case PV_CONTINUE:
/* fields: none
*/
break;
-
+
case PV_IFTIME:
/* fields: item->u1.list == there are 4 linked PV_WORDs here.
traverse_pval_item_template(item->u3.else_statements,depth+1);
}
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random number expression, as supplied by user
traverse_pval_item_template(item->u3.else_statements,depth+1);
}
break;
-
+
case PV_IF:
/* fields: item->u1.str == the if conditional, as supplied by user
traverse_pval_item_template(item->u3.else_statements,depth+1);
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
*/
traverse_pval_item_template(item->u2.statements,depth+1);
break;
-
+
case PV_IGNOREPAT:
/* fields: item->u1.str == the ignorepat data
*/
break;
-
+
case PV_GLOBALS:
/* fields: item->u1.statements == pval list of statements, usually vardecs
*/
but you may not need it */
{
pval *i;
-
+
for (i=item; i; i=i->next) {
traverse_pval_item_template(i, depth);
}
{
int err1;
regex_t preg;
-
+
/* simple case, they match exactly, the pattern and exten name */
if (strcmp(pattern,exten) == 0)
return 1;
-
+
if (pattern[0] == '_') {
char reg1[2000];
const char *p;
char *r = reg1;
-
+
if ( strlen(pattern)*5 >= 2000 ) /* safety valve */ {
ast_log(LOG_ERROR,"Error: The pattern %s is way too big. Pattern matching cancelled.\n",
pattern);
*r++ = 'X';
*r++ = ']';
break;
-
+
case 'Z':
*r++ = '[';
*r++ = '1';
*r++ = 'Z';
*r++ = ']';
break;
-
+
case 'N':
*r++ = '[';
*r++ = '2';
*r++ = 'N';
*r++ = ']';
break;
-
+
case '[':
while ( *p && *p != ']' ) {
*r++ = *p++;
here->filename, here->startline, here->endline, pattern);
}
break;
-
+
case '.':
case '!':
*r++ = '.';
default:
*r++ = *p;
break;
-
+
}
}
*r++ = '$'; /* what if the extension is a pattern ?? */
}
err1 = regexec(&preg, exten, 0, 0, 0);
regfree(&preg);
-
+
if ( err1 ) {
/* ast_log(LOG_NOTICE,"*****************************[%d]Extension %s did not match %s(%s)\n",
err1,exten, pattern, reg1); */
exten, pattern); */
return 1;
}
-
-
+
+
} else {
if ( strcmp(exten,pattern) == 0 ) {
return 1;
}
*e = '\0';
e++;
- while (*e && !isdigit(*e))
+ while (*e && !isdigit(*e))
e++;
if (!*e) {
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: The time range format (%s) is missing the end time!\n",
char *c;
/* The following line is coincidence, really! */
int s, e;
-
+
dow = ast_strdupa(DOW->u1.str);
/* Check for all days */
mon = ast_strdupa(MON->u1.str);
/* Check for all days */
- if (ast_strlen_zero(mon) || !strcmp(mon, "*"))
+ if (ast_strlen_zero(mon) || !strcmp(mon, "*"))
return ;
/* Get start and ending days */
c = strchr(mon, '-');
static int check_break(pval *item)
{
pval *p = item;
-
+
while( p && p->type != PV_MACRO && p->type != PV_CONTEXT ) /* early cutout, sort of */ {
/* a break is allowed in WHILE, FOR, CASE, DEFAULT, PATTERN; otherwise, it don't make
no sense */
- if( p->type == PV_CASE || p->type == PV_DEFAULT || p->type == PV_PATTERN
+ if( p->type == PV_CASE || p->type == PV_DEFAULT || p->type == PV_PATTERN
|| p->type == PV_WHILE || p->type == PV_FOR ) {
return 1;
}
ast_log(LOG_ERROR,"Error: file %s, line %d-%d: 'break' not in switch, for, or while statement!\n",
item->filename, item->startline, item->endline);
errs++;
-
+
return 0;
}
static int check_continue(pval *item)
{
pval *p = item;
-
+
while( p && p->type != PV_MACRO && p->type != PV_CONTEXT ) /* early cutout, sort of */ {
/* a break is allowed in WHILE, FOR, CASE, DEFAULT, PATTERN; otherwise, it don't make
no sense */
ast_log(LOG_ERROR,"Error: file %s, line %d-%d: 'continue' not in 'for' or 'while' statement!\n",
item->filename, item->startline, item->endline);
errs++;
-
+
return 0;
}
static struct pval *in_macro(pval *item)
{
struct pval *curr;
- curr = item;
+ curr = item;
while( curr ) {
if( curr->type == PV_MACRO ) {
return curr;
static struct pval *in_context(pval *item)
{
struct pval *curr;
- curr = item;
+ curr = item;
while( curr ) {
if( curr->type == PV_MACRO || curr->type == PV_CONTEXT ) {
return curr;
struct pval *curr;
struct pval *x;
int alright = 0;
-
+
/* A label outside an extension just plain does not make sense! */
-
+
curr = item;
-
+
while( curr ) {
if( curr->type == PV_MACRO || curr->type == PV_EXTENSION ) {
alright = 1;
{
ast_log(LOG_ERROR,"Error: file %s, line %d-%d: Label %s is not within an extension or macro!\n",
item->filename, item->startline, item->endline, item->u1.str);
- errs++;
+ errs++;
}
-
-
+
+
/* basically, ensure that a label is not repeated in a context. Period.
The method: well, for each label, find the first label in the context
with the same name. If it's not the current label, then throw an error. */
-
+
/* printf("==== check_label: ====\n"); */
if( !current_extension )
curr = current_context;
else
curr = current_extension;
-
+
x = find_first_label_in_current_context((char *)item->u1.str, curr);
/* printf("Hey, check_label found with item = %x, and x is %x, and currcont is %x, label name is %s\n", item,x, current_context, (char *)item->u1.str); */
if( x && x != item )
/* just one item-- the label should be in the current extension */
pval *curr_ext = get_extension_or_contxt(item); /* containing exten, or macro */
pval *curr_cont;
-
+
if (!item->u1.list) {
return NULL;
}
/* TWO items */
if (item->u1.list->next && !item->u1.list->next->next) {
- if (!strstr((item->u1.list)->u1.str,"${")
+ if (!strstr((item->u1.list)->u1.str,"${")
&& !strstr(item->u1.list->next->u1.str,"${") ) /* Don't try to match variables */ {
struct pval *x = find_label_in_current_context((char *)item->u1.list->u1.str, (char *)item->u1.list->next->u1.str, curr_cont);
return x;
}
}
-
+
/* All 3 items! */
if (item->u1.list->next && item->u1.list->next->next) {
/* all three */
pval *first = item->u1.list;
pval *second = item->u1.list->next;
pval *third = item->u1.list->next->next;
-
- if (!strstr((item->u1.list)->u1.str,"${")
+
+ if (!strstr((item->u1.list)->u1.str,"${")
&& !strstr(item->u1.list->next->u1.str,"${")
&& !strstr(item->u1.list->next->next->u1.str,"${")) /* Don't try to match variables */ {
struct pval *x = find_label_in_current_db((char*)first->u1.str, (char*)second->u1.str, (char*)third->u1.str);
struct pval *p3;
struct pval *that_context = find_context(item->u1.list->u1.str);
-
+
/* the target of the goto could be in an included context!! Fancy that!! */
/* look for includes in the current context */
if (that_context) {
else
return;
}
-
+
/* TWO items */
if (item->u1.list->next && !item->u1.list->next->next) {
/* two items */
/* printf("Calling find_label_in_current_context with args %s, %s\n",
(char*)((item->u1.list)->u1.str), (char *)item->u1.list->next->u1.str); */
- if (!strstr((item->u1.list)->u1.str,"${")
+ if (!strstr((item->u1.list)->u1.str,"${")
&& !strstr(item->u1.list->next->u1.str,"${") ) /* Don't try to match variables */ {
struct pval *z = get_contxt(item);
struct pval *x = 0;
-
+
if (z)
x = find_label_in_current_context((char *)item->u1.list->u1.str, (char *)item->u1.list->next->u1.str, z);
return;
}
}
-
+
/* All 3 items! */
if (item->u1.list->next && item->u1.list->next->next) {
/* all three */
pval *first = item->u1.list;
pval *second = item->u1.list->next;
pval *third = item->u1.list->next->next;
-
+
/* printf("Calling find_label_in_current_db with args %s, %s, %s\n",
(char*)first->u1.str, (char*)second->u1.str, (char*)third->u1.str); */
- if (!strstr((item->u1.list)->u1.str,"${")
+ if (!strstr((item->u1.list)->u1.str,"${")
&& !strstr(item->u1.list->next->u1.str,"${")
&& !strstr(item->u1.list->next->next->u1.str,"${")) /* Don't try to match variables */ {
struct pval *x = find_label_in_current_db((char*)first->u1.str, (char*)second->u1.str, (char*)third->u1.str);
struct pval *p3;
struct pval *found = 0;
struct pval *that_context = find_context(item->u1.list->u1.str);
-
+
/* the target of the goto could be in an included context!! Fancy that!! */
/* look for includes in the current context */
if (that_context) {
{
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: It's bad form to have a goto in a macro to a target outside the macro!\n",
item->filename, item->startline, item->endline);
- warns++;
+ warns++;
}
}
}
#ifdef STANDALONE
struct pbx_find_info pfiq = {.stacklen = 0 };
extern int localized_pbx_load_module(void);
- /* if this is a standalone, we will need to make sure the
+ /* if this is a standalone, we will need to make sure the
localized load of extensions.conf is done */
if (!extensions_dot_conf_loaded) {
localized_pbx_load_module();
}
pbx_find_extension(NULL, NULL, &pfiq, first->u1.str, second->u1.str, atoi(third->u1.str),
- atoi(third->u1.str) ? NULL : third->u1.str, NULL,
+ atoi(third->u1.str) ? NULL : third->u1.str, NULL,
atoi(third->u1.str) ? E_MATCH : E_FINDLABEL);
-
+
if (pfiq.status != STATUS_SUCCESS) {
ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: goto: Couldn't find goto target %s|%s|%s, not even in extensions.conf!\n",
item->filename, item->startline, item->endline, first->u1.str, second->u1.str, third->u1.str);
{
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: It's bad form to have a goto in a macro to a target outside the macro!\n",
item->filename, item->startline, item->endline);
- warns++;
+ warns++;
}
}
}
}
}
}
-
+
static void find_pval_goto_item(pval *item, int lev)
{
struct pval *p4;
-
+
if (lev>100) {
ast_log(LOG_ERROR,"find_pval_goto in infinite loop! item_type: %u\n\n", item->type);
return;
}
-
+
switch ( item->type ) {
case PV_MACRO:
/* fields: item->u1.str == name of macro
item->u3.macro_statements == pval list of statements in macro body.
*/
-
+
/* printf("Descending into macro %s at line %d\n", item->u1.str, item->startline); */
find_pval_gotos(item->u3.macro_statements,lev+1); /* if we're just searching for a context, don't bother descending into them */
-
+
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
/* printf("Descending into Case of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
/* printf("Descending into Pattern of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
/* printf("Descending into default\n"); */
find_pval_gotos(item->u2.statements,lev+1);
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
/* printf("Descending into catch of %s\n", item->u1.str); */
find_pval_gotos(item->u2.statements,lev+1);
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
/* printf("Descending into statement block\n"); */
find_pval_gotos(item->u1.list,lev+1);
break;
-
+
case PV_GOTO:
/* fields: item->u1.list == pval list of PV_WORD target names, up to 3, in order as given by user.
item->u1.list->u1.str == where the data on a PV_WORD will always be.
*/
check_goto(item); /* THE WHOLE FUNCTION OF THIS ENTIRE ROUTINE!!!! */
break;
-
+
case PV_INCLUDES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
}
}
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
/* printf("Descending into for at line %d\n", item->startline); */
find_pval_gotos(item->u4.for_statements,lev+1);
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
/* printf("Descending into while at line %d\n", item->startline); */
find_pval_gotos(item->u2.statements,lev+1);
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random number expression, as supplied by user
item->u3.else_statements == a pval list of statements in the else
(could be zero)
fall thru to PV_IF */
-
+
case PV_IFTIME:
/* fields: item->u1.list == the time values, 4 of them, as PV_WORD structs in a list
find_pval_gotos(item->u3.else_statements,lev+1);
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
/* printf("Descending into switch at line %d\n", item->startline); */
find_pval_gotos(item->u3.else_statements,lev+1);
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
static void find_pval_gotos(pval *item,int lev)
{
pval *i;
-
+
for (i=item; i; i=i->next) {
/* printf("About to call pval_goto_item, itemcount=%d, itemtype=%d\n", item_count, i->type); */
find_pval_goto_item(i, lev);
static struct pval *match_pval_item(pval *item)
{
pval *x;
-
+
switch ( item->type ) {
case PV_MACRO:
/* fields: item->u1.str == name of macro
*/
/* printf(" matching in MACRO %s, match_context=%s; retoncontmtch=%d; \n", item->u1.str, match_context, return_on_context_match); */
if (!strcmp(match_context,"*") || !strcmp(item->u1.str, match_context)) {
-
+
/* printf("MACRO: match context is: %s\n", match_context); */
-
+
if (return_on_context_match && !strcmp(item->u1.str, match_context)) /* if we're just searching for a context, don't bother descending into them */ {
/* printf("Returning on matching macro %s\n", match_context); */
return item;
}
-
-
+
+
if (!return_on_context_match) {
/* printf("Descending into matching macro %s/%s\n", match_context, item->u1.str); */
if ((x=match_pval(item->u3.macro_statements))) {
} else {
/* printf("Skipping context/macro %s\n", item->u1.str); */
}
-
+
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
/* printf("non-CONTEXT: Responded with pval match %x\n", x); */
return item;
}
-
+
if (!return_on_context_match ) {
/* printf("Descending into matching context %s\n", match_context); */
if ((x=match_pval(item->u2.statements))) /* if we're just searching for a context, don't bother descending into them */ {
return x;
}
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
return x;
}
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
/* printf(" matching in DEFAULT\n"); */
return x;
}
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
return x;
}
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
return x;
}
break;
-
+
case PV_LABEL:
/* fields: item->u1.str == label name
*/
- /* printf("PV_LABEL %s (cont=%s, exten=%s\n",
+ /* printf("PV_LABEL %s (cont=%s, exten=%s\n",
item->u1.str, current_context->u1.str, (current_extension?current_extension->u1.str:"<macro>"));*/
-
+
if (count_labels) {
if (!strcmp(match_label, item->u1.str)) {
label_count++;
last_matched_label = item;
}
-
+
} else {
if (!strcmp(match_label, item->u1.str)) {
/* printf("LABEL: Responded with pval match %x\n", x); */
}
}
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
return x;
}
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
return x;
}
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random number expression, as supplied by user
item->u3.else_statements == a pval list of statements in the else
(could be zero)
fall thru to PV_IF */
-
+
case PV_IFTIME:
/* fields: item->u1.list == the time values, 4 of them, as PV_WORD structs in a list
}
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
/* printf(" matching in SWITCH\n"); */
return x;
}
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
for (i=item; i; i=i->next) {
pval *x;
/* printf(" -- match pval: item %d\n", i->type); */
-
+
if ((x = match_pval_item(i))) {
/* printf("match_pval: returning x=%x\n", (int)x); */
return x; /* cut the search short */
count_labels = 1;
return_on_context_match = 0;
match_pval(current_context->u2.statements);
-
+
return label_count;
}
#endif
/* printf(" --- Got args %s, %s\n", exten, label); */
struct pval *ret;
struct pval *p3;
-
+
count_labels = 0;
return_on_context_match = 0;
match_context = "*";
match_exten = "*";
match_label = label;
-
+
ret = match_pval(curr_cont);
if (ret)
return ret;
-
+
/* the target of the goto could be in an included context!! Fancy that!! */
/* look for includes in the current context */
for (p3=curr_cont->u2.statements; p3; p3=p3->next) {
/* printf(" --- Got args %s, %s\n", exten, label); */
struct pval *ret;
struct pval *p3;
-
+
count_labels = 0;
return_on_context_match = 0;
match_context = "*";
ret = match_pval(curr_cont->u2.statements);
if (ret)
return ret;
-
+
/* the target of the goto could be in an included context!! Fancy that!! */
/* look for includes in the current context */
for (p3=curr_cont->u2.statements; p3; p3=p3->next) {
match_context = context;
match_exten = exten;
match_label = label;
-
+
return match_pval(current_db);
}
{
struct argchoice *ac;
char *opcop,*q,*p;
-
+
switch (should->dtype) {
case ARGD_OPTIONSET:
if ( strstr(is->u1.str,"${") )
return 0; /* no checking anything if there's a var reference in there! */
-
+
opcop = ast_strdupa(is->u1.str);
for (q=opcop;*q;q++) { /* erase the innards of X(innard) type arguments, so we don't get confused later */
q = p+1;
}
}
-
+
for (ac=app->opts; ac; ac=ac->next) {
if (strlen(ac->name)>1 && strchr(ac->name,'(') == 0 && strcmp(ac->name,is->u1.str) == 0) /* multichar option, no parens, and a match? */
return 0;
for (ac=app->opts; ac; ac=ac->next) {
if (strlen(ac->name)==1 || strchr(ac->name,'(')) {
char *p = strchr(opcop,ac->name[0]); /* wipe out all matched options in the user-supplied string */
-
+
if (p && *p == 'j') {
ast_log(LOG_ERROR, "Error: file %s, line %d-%d: The j option in the %s application call is not appropriate for AEL!\n",
is->filename, is->startline, is->endline, app->name);
errs++;
}
-
+
if (p) {
*p = '+';
if (ac->name[1] == '(') {
default:
return 0;
}
-
+
}
int option_matches( struct argdesc *should, pval *is, struct argapp *app)
{
struct argchoice *ac;
char *opcop;
-
+
switch (should->dtype) {
case ARGD_STRING:
if (is_empty(is->u1.str) && should->type == ARGD_REQUIRED)
if (is->u1.str && strlen(is->u1.str) > 0) /* most will match */
return 1;
break;
-
+
case ARGD_INT:
if (is_int(is->u1.str))
return 1;
else
return 0;
break;
-
+
case ARGD_FLOAT:
if (is_float(is->u1.str))
return 1;
else
return 0;
break;
-
+
case ARGD_ENUM:
if( !is->u1.str || strlen(is->u1.str) == 0 )
return 1; /* a null arg in the call will match an enum, I guess! */
}
return 0;
break;
-
+
case ARGD_OPTIONSET:
opcop = ast_strdupa(is->u1.str);
-
+
for (ac=app->opts; ac; ac=ac->next) {
if (strlen(ac->name)>1 && strchr(ac->name,'(') == 0 && strcmp(ac->name,is->u1.str) == 0) /* multichar option, no parens, and a match? */
return 1;
for (ac=app->opts; ac; ac=ac->next) {
if (strlen(ac->name)==1 || strchr(ac->name,'(')) {
char *p = strchr(opcop,ac->name[0]); /* wipe out all matched options in the user-supplied string */
-
+
if (p) {
*p = '+';
if (ac->name[1] == '(') {
struct argdesc *ad = app->args;
pval *pa;
int z;
-
+
for (pa = arglist; pa; pa=pa->next) {
if (!ad) {
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: Extra argument %s not in application call to %s !\n",
do {
if ( ad->dtype == ARGD_VARARG ) /* once we hit the VARARG, all bets are off. Discontinue the comparisons */
break;
-
+
z= option_matches( ad, pa, app);
if (!z) {
if ( !arglist )
arglist=appcall;
-
+
if (ad->type == ARGD_REQUIRED) {
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: Required argument %s not in application call to %s !\n",
arglist->filename, arglist->startline, arglist->endline, ad->dtype==ARGD_OPTIONSET?"options":ad->name, app->name);
/* any app nodes left, that are not optional? */
for ( ; ad; ad=ad->next) {
if (ad->type == ARGD_REQUIRED && ad->dtype != ARGD_VARARG) {
- if ( !arglist )
+ if ( !arglist )
arglist=appcall;
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: Required argument %s not in application call to %s !\n",
arglist->filename, arglist->startline, arglist->endline, ad->dtype==ARGD_OPTIONSET?"options":ad->name, app->name);
struct appsetvar *v,*v2;
struct argchoice *c;
pval *t;
-
+
p = item->u1.str;
while (p && *p && (*p == ' ' || *p == '\t' || *p == '$' || *p == '{' ) )
p++;
-
+
buff1 = ast_strdupa(p);
while (strlen(buff1) > 0 && ( buff1[strlen(buff1)-1] == '}' || buff1[strlen(buff1)-1] == ' ' || buff1[strlen(buff1)-1] == '\t'))
int def= 0;
int pat = 0;
int f1 = 0;
-
+
/* first of all, does this switch have a default case ? */
for (t=item->u2.statements; t; t=t->next) {
if (t->type == PV_DEFAULT) {
if (f1)
break;
}
-
+
/* see if it sets the var */
if (!f1) {
ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: Couldn't find an application call in this extension that sets the expression (%s) value!\n",
#else
pval *t,*tl=0,*p2;
int def= 0;
-
+
/* first of all, does this switch have a default case ? */
for (t=item->u2.statements; t; t=t->next) {
if (t->type == PV_DEFAULT) {
return;
/* if no default, warn and insert a default case at the end */
p2 = tl->next = calloc(1, sizeof(struct pval));
-
+
p2->type = PV_DEFAULT;
p2->startline = tl->startline;
p2->endline = tl->endline;
ast_log(LOG_WARNING,"Warning: file %s, line %d-%d: A default case was automatically added to the switch.\n",
p2->filename, p2->startline, p2->endline);
warns++;
-
+
#endif
}
{
pval *i,*j;
/* find some context includes that reference this context */
-
+
/* otherwise, print out a warning */
for (i=current_db; i; i=i->next) {
char errmsg[4096];
char *strp;
-
+
switch (item->type) {
case PV_WORD:
/* fields: item->u1.str == string associated with this (word).
item->u2.arglist == pval list of 4 PV_WORD elements for time values (only in PV_INCLUDES) */
break;
-
+
case PV_MACRO:
/* fields: item->u1.str == name of macro
item->u2.arglist == pval list of PV_WORD arguments of macro, as given by user
current_extension = 0;
check_macro_returns(item);
-
+
for (lp=item->u2.arglist; lp; lp=lp->next) {
-
+
}
check_pval(item->u3.macro_statements, apps,in_globals);
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
in_abstract_context = 0;
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_MACRO_CALL:
/* fields: item->u1.str == name of macro to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
item->u2.arglist->next == next arg
*/
#ifdef STANDALONE
- /* if this is a standalone, we will need to make sure the
+ /* if this is a standalone, we will need to make sure the
localized load of extensions.conf is done */
if (!extensions_dot_conf_loaded) {
localized_pbx_load_module();
/* look for the macro in the extensions.conf world */
pbx_find_extension(NULL, NULL, &pfiq, item->u1.str, "s", 1, NULL, NULL, E_MATCH);
-
+
if (pfiq.status != STATUS_SUCCESS) {
char namebuf2[256];
snprintf(namebuf2, 256, "macro-%s", item->u1.str);
-
+
/* look for the macro in the extensions.conf world */
pbx_find_extension(NULL, NULL, &pfiq2, namebuf2, "s", 1, NULL, NULL, E_MATCH);
-
+
if (pfiq2.status == STATUS_SUCCESS) {
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: macro call to non-existent %s! (macro-%s was found in the extensions.conf stuff, but we are using gosubs!)\n",
item->filename, item->startline, item->endline, item->u1.str, item->u1.str);
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: macro call to %s cannot be found in the AEL code!\n",
item->filename, item->startline, item->endline, item->u1.str);
warns++;
-
+
#endif
#ifdef THIS_IS_1DOT4
char namebuf2[256];
/* look for the macro in the extensions.conf world */
pbx_find_extension(NULL, NULL, &pfiq, namebuf2, "s", 1, NULL, NULL, E_MATCH);
-
+
if (pfiq.status != STATUS_SUCCESS) {
ast_log(LOG_WARNING, "Warning: file %s, line %d-%d: macro call to %s was not found in the AEL, nor the extensions.conf !\n",
item->filename, item->startline, item->endline, item->u1.str);
warns++;
}
-
+
#endif
} else if (macro_def->type != PV_MACRO) {
/* macro_def is a MACRO, so do the args match in number? */
int hereargs = 0;
int thereargs = 0;
-
+
for (lp=item->u2.arglist; lp; lp=lp->next) {
hereargs++;
}
}
}
break;
-
+
case PV_APPLICATION_CALL:
/* fields: item->u1.str == name of application to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
free(item->u1.str);
item->u1.str = 0;
}
-
+
#ifdef AAL_ARGCHECK
found = 0;
for (app=apps; app; app=app->next) {
check_app_args(item, item->u2.arglist, app);
#endif
break;
-
+
case PV_CASE:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
/* find the last statement */
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
*/
/* Make sure sequence of statements under case is terminated with goto, return, or break */
/* find the last statement */
-
+
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
*/
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_SWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
check_pval(item->u1.list, apps,in_globals);
break;
-
+
case PV_ESWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
check_pval(item->u1.list, apps,in_globals);
break;
-
+
case PV_INCLUDES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
check_day(lp->u2.arglist->next->next);
check_month(lp->u2.arglist->next->next->next);
}
-
+
if (that_context) {
find_pval_gotos(that_context->u2.statements,0);
-
+
}
}
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
check_pval(item->u1.list, apps,in_globals);
break;
-
+
case PV_VARDEC:
/* fields: item->u1.str == variable name
item->u2.val == variable value to assign
check_expr2_input(item,item->u2.val);
}
break;
-
+
case PV_LOCALVARDEC:
/* fields: item->u1.str == variable name
item->u2.val == variable value to assign
}
check_expr2_input(item,item->u2.val);
break;
-
+
case PV_GOTO:
/* fields: item->u1.list == pval list of PV_WORD target names, up to 3, in order as given by user.
item->u1.list->u1.str == where the data on a PV_WORD will always be.
/* don't check goto's in abstract contexts */
if ( in_abstract_context )
break;
-
+
check_goto(item);
break;
-
+
case PV_LABEL:
/* fields: item->u1.str == label name
*/
check_label(item);
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
}
check_expr2_input(item,item->u2.for_test);
check_expr2_input(item,item->u3.for_inc);
-
+
ast_expr_clear_extra_error_info();
check_pval(item->u4.for_statements, apps,in_globals);
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
check_expr2_input(item,item->u1.str);
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_BREAK:
/* fields: none
*/
check_break(item);
break;
-
+
case PV_RETURN:
/* fields: none
*/
break;
-
+
case PV_CONTINUE:
/* fields: none
*/
check_continue(item);
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random number expression, as supplied by user
break;
case PV_IFTIME:
- /* fields: item->u1.list == the if time values, 4 of them, each in PV_WORD, linked list
+ /* fields: item->u1.list == the if time values, 4 of them, each in PV_WORD, linked list
item->u2.statements == a pval list of statements in the if ()
item->u3.else_statements == a pval list of statements in the else
check_pval(item->u3.else_statements, apps,in_globals);
}
break;
-
+
case PV_IF:
/* fields: item->u1.str == the if conditional, as supplied by user
check_pval(item->u3.else_statements, apps,in_globals);
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
/* we can check the switch expression, see if it matches any of the app variables...
check_switch_expr(item, apps);
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
item->u4.regexten == an int boolean. non-zero says that regexten was specified
*/
current_extension = item ;
-
+
check_pval(item->u2.statements, apps,in_globals);
break;
-
+
case PV_IGNOREPAT:
/* fields: item->u1.str == the ignorepat data
*/
break;
-
+
case PV_GLOBALS:
/* fields: item->u1.statements == pval list of statements, usually vardecs
*/
pval *i;
/* checks to do:
- 1. Do goto's point to actual labels?
+ 1. Do goto's point to actual labels?
2. Do macro calls reference a macro?
3. Does the number of macro args match the definition?
4. Is a macro call missing its & at the front?
5. Application calls-- we could check syntax for existing applications,
- but I need some some sort of universal description bnf for a general
- sort of method for checking arguments, in number, maybe even type, at least.
+ but I need some sort of universal description bnf for a general
+ sort of method for checking arguments, in number, maybe even type, at least.
Don't want to hand code checks for hundreds of applications.
*/
-
+
for (i=item; i; i=i->next) {
check_pval_item(i,apps,in_globals);
}
void ael2_semantic_check(pval *item, int *arg_errs, int *arg_warns, int *arg_notes)
{
-
+
#ifdef AAL_ARGCHECK
int argapp_errs =0;
char *rfilename;
#ifdef AAL_ARGCHECK
rfilename = ast_alloca(10 + strlen(ast_config_AST_VAR_DIR));
sprintf(rfilename, "%s/applist", ast_config_AST_VAR_DIR);
-
+
apps = argdesc_parse(rfilename, &argapp_errs); /* giveth */
#endif
current_db = item;
void linkprio(struct ael_extension *exten, struct ael_priority *prio, struct ael_extension *mother_exten)
{
char *p1, *p2;
-
+
if (!exten->plist) {
exten->plist = prio;
exten->plist_last = prio;
}
if( !prio->exten )
prio->exten = exten; /* don't override the switch value */
- /* The following code will cause all priorities within an extension
+ /* The following code will cause all priorities within an extension
to have ${EXTEN} or ${EXTEN: replaced with ~~EXTEN~~, which is
set just before the first switch in an exten. The switches
will muck up the original ${EXTEN} value, so we save it away
struct ael_extension *ne, *nen;
for (ne=exten; ne; ne=nen) {
struct ael_priority *pe, *pen;
-
+
if (ne->name)
free(ne->name);
-
+
/* cidmatch fields are allocated with name, and freed when
the name field is freed. Don't do a free for this field,
unless you LIKE to see a crash! */
if (ne->hints)
free(ne->hints);
-
+
for (pe=ne->plist; pe; pe=pen) {
pen = pe->next;
if (pe->app)
static int label_inside_case(pval *label)
{
pval *p = label;
-
+
while( p && p->type != PV_MACRO && p->type != PV_CONTEXT ) /* early cutout, sort of */ {
if( p->type == PV_CASE || p->type == PV_DEFAULT || p->type == PV_PATTERN ) {
return 1;
case PV_LOCALVARDEC:
/* fields: item->u1.str == string associated with this (word). */
break;
-
+
case PV_WORD:
/* fields: item->u1.str == string associated with this (word). */
break;
-
+
case PV_MACRO:
/* fields: item->u1.str == name of macro
item->u2.arglist == pval list of PV_WORD arguments of macro, as given by user
if (contains_switch(item->u3.macro_statements))
return 1;
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_MACRO_CALL:
/* fields: item->u1.str == name of macro to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
item->u2.arglist->next == next arg
*/
break;
-
+
case PV_APPLICATION_CALL:
/* fields: item->u1.str == name of application to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
item->u2.arglist->next == next arg
*/
break;
-
+
case PV_CASE:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
/* had better not see this */
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_SWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
break;
-
+
case PV_ESWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
break;
-
+
case PV_INCLUDES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
item->u2.arglist == pval list of 4 PV_WORD elements for time values
*/
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
if (contains_switch(item->u1.list) )
return 1;
break;
-
+
case PV_VARDEC:
/* fields: item->u1.str == variable name
item->u2.val == variable value to assign
*/
break;
-
+
case PV_GOTO:
/* fields: item->u1.list == pval list of PV_WORD target names, up to 3, in order as given by user.
item->u1.list->u1.str == where the data on a PV_WORD will always be.
*/
break;
-
+
case PV_LABEL:
/* fields: item->u1.str == label name
*/
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
if (contains_switch(item->u4.for_statements))
return 1;
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_BREAK:
/* fields: none
*/
break;
-
+
case PV_RETURN:
/* fields: none
*/
break;
-
+
case PV_CONTINUE:
/* fields: none
*/
break;
-
+
case PV_IFTIME:
/* fields: item->u1.list == there are 4 linked PV_WORDs here.
return 1;
}
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random number expression, as supplied by user
return 1;
}
break;
-
+
case PV_IF:
/* fields: item->u1.str == the if conditional, as supplied by user
return 1;
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
return 1; /* JACKPOT */
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
if (contains_switch(item->u2.statements))
return 1;
break;
-
+
case PV_IGNOREPAT:
/* fields: item->u1.str == the ignorepat data
*/
break;
-
+
case PV_GLOBALS:
/* fields: item->u1.statements == pval list of statements, usually vardecs
*/
int contains_switch(pval *item)
{
pval *i;
-
+
for (i=item; i; i=i->next) {
if (find_switch_item(i))
return 1;
if (!(new_label = malloc(BUF_SIZE))) {
return -1;
}
-
+
if ((mother_exten && !mother_exten->checked_switch) || (exten && !exten->checked_switch)) {
if (contains_switch(statement)) { /* only run contains_switch if you haven't checked before */
if (mother_exten) {
pr->origin = p;
linkprio(exten, pr, mother_exten);
break;
-
+
case PV_GOTO:
pr = new_prio();
pr->type = AEL_APPCALL;
if( p->u2.goto_target ) {
p->u3.goto_target_in_case = label_inside_case(p->u2.goto_target);
}
-
+
if (!p->u1.list->next) /* just one */ {
pr->app = strdup("Goto");
if (!mother_exten)
pr->appargs = strdup(p->u1.list->u1.str);
- else { /* for the case of simple within-extension gotos in case/pattern/default statement blocks: */
+ else { /* for the case of simple within-extension gotos in case/pattern/default statement blocks: */
snprintf(buf1, BUF_SIZE, "%s,%s", mother_exten->name, p->u1.list->u1.str);
pr->appargs = strdup(buf1);
}
-
+
} else if (p->u1.list->next && !p->u1.list->next->next) /* two */ {
snprintf(buf1, BUF_SIZE, "%s,%s", p->u1.list->u1.str, p->u1.list->next->u1.str);
pr->app = strdup("Goto");
pr->appargs = strdup(buf1);
} else if (p->u1.list->next && p->u1.list->next->next) {
- snprintf(buf1, BUF_SIZE, "%s,%s,%s", p->u1.list->u1.str,
+ snprintf(buf1, BUF_SIZE, "%s,%s,%s", p->u1.list->u1.str,
p->u1.list->next->u1.str,
p->u1.list->next->next->u1.str);
pr->app = strdup("Goto");
for_loop->type = AEL_CONTROL1; /* simple goto */
for_end->type = AEL_APPCALL;
for_init->app = strdup("MSet");
-
+
strcpy(buf2,p->u1.for_init);
remove_spaces_before_equals(buf2);
strp = strchr(buf2, '=');
/* link & load! */
linkprio(exten, for_init, mother_exten);
linkprio(exten, for_test, mother_exten);
-
+
/* now, put the body of the for loop here */
exten->loop_break = for_end;
exten->loop_continue = for_inc;
-
+
if (gen_prios(exten, new_label, p->u4.for_statements, mother_exten, this_context)) { /* this will link in all the statements here */
return -1;
}
-
+
linkprio(exten, for_inc, mother_exten);
linkprio(exten, for_loop, mother_exten);
linkprio(exten, for_end, mother_exten);
-
-
+
+
exten->loop_break = loop_break_save;
exten->loop_continue = loop_continue_save;
for_loop->origin = p;
while_end->appargs = strdup(buf1);
linkprio(exten, while_test, mother_exten);
-
+
/* now, put the body of the for loop here */
exten->loop_break = while_end;
exten->loop_continue = while_test;
-
+
if (gen_prios(exten, new_label, p->u2.statements, mother_exten, this_context)) { /* this will link in all the while body statements here */
return -1;
}
linkprio(exten, while_loop, mother_exten);
linkprio(exten, while_end, mother_exten);
-
-
+
+
exten->loop_break = loop_break_save;
exten->loop_continue = loop_continue_save;
while_loop->origin = p;
linkprio(exten, switch_test, mother_exten);
linkprio(exten, switch_end, mother_exten);
-
+
exten->loop_break = switch_end;
exten->loop_continue = 0;
default_exists = 0;
-
+
for (p2=p->u2.statements; p2; p2=p2->next) {
/* now, for each case/default put the body of the for loop here */
if (p2->type == PV_CASE) {
/* the break/continue locations are inherited from parent */
switch_case->loop_break = exten->loop_break;
switch_case->loop_continue = exten->loop_continue;
-
+
linkexten(exten,switch_case);
snprintf(buf1, BUF_SIZE, "sw_%d_%s", local_control_statement_count, p2->u1.str);
switch_case->name = strdup(buf1);
snprintf(new_label, BUF_SIZE, "sw_%s_%s_%d", label, p2->u1.str, local_control_statement_count);
-
+
if (gen_prios(switch_case, new_label, p2->u2.statements, exten, this_context)) { /* this will link in all the case body statements here */
return -1;
}
}
switch_case->context = this_context;
switch_case->is_switch = 1;
-
+
/* new: the default case intros a pattern with ., which covers ALMOST everything.
but it doesn't cover a NULL pattern. So, we'll define a null extension to match
that goto's the default extension. */
linkexten(exten,switch_case);
snprintf(buf1, BUF_SIZE, "_sw_%d_.", local_control_statement_count);
switch_case->name = strdup(buf1);
-
+
snprintf(new_label, BUF_SIZE, "sw_%s_default_%d", label, local_control_statement_count);
-
+
if (gen_prios(switch_case, new_label, p2->u2.statements, exten, this_context)) { /* this will link in all the default: body statements here */
return -1;
}
-
+
/* here is where we write code to "fall thru" to the next case... if there is one... */
for (p3=p2->u2.statements; p3; p3=p3->next) {
if (!p3->next)
/* what could it be??? */
}
}
-
+
exten->loop_break = loop_break_save;
exten->loop_continue = loop_continue_save;
switch_test->origin = p;
case PV_IFTIME:
control_statement_count++;
snprintf(new_label, BUF_SIZE, "iftime_%s_%d", label, control_statement_count);
-
+
if_test = new_prio();
if_test->type = AEL_IFTIME_CONTROL;
snprintf(buf1, BUF_SIZE, "%s,%s,%s,%s",
- p->u1.list->u1.str,
- p->u1.list->next->u1.str,
- p->u1.list->next->next->u1.str,
+ p->u1.list->u1.str,
+ p->u1.list->next->u1.str,
+ p->u1.list->next->next->u1.str,
p->u1.list->next->next->next->u1.str);
if_test->app = 0;
if_test->appargs = strdup(buf1);
} else {
if_false->goto_true = if_end;
}
-
+
/* link & load! */
linkprio(exten, if_test, mother_exten);
linkprio(exten, if_false, mother_exten);
-
+
/* now, put the body of the if here */
-
+
if (gen_prios(exten, new_label, p->u2.statements, mother_exten, this_context)) { /* this will link in all the statements here */
return -1;
}
-
+
if (p->u3.else_statements) {
linkprio(exten, if_skip, mother_exten);
if (gen_prios(exten, new_label, p->u3.else_statements, mother_exten, this_context)) { /* this will link in all the statements here */
return -1;
}
}
-
+
linkprio(exten, if_end, mother_exten);
-
+
break;
case PV_RANDOM:
case PV_IF:
control_statement_count++;
snprintf(new_label, BUF_SIZE, "if_%s_%d", label, control_statement_count);
-
+
if_test = new_prio();
if_end = new_prio();
if_test->type = AEL_IF_CONTROL;
if_end->app = strdup("NoOp");
if_end->appargs = strdup(buf1);
if_test->origin = p;
-
+
if (p->u3.else_statements) {
if_skip = new_prio();
if_skip->type = AEL_CONTROL1; /* simple goto */
if_skip = 0;
if_test->goto_false = if_end;;
}
-
+
/* link & load! */
linkprio(exten, if_test, mother_exten);
-
+
/* now, put the body of the if here */
-
+
if (gen_prios(exten, new_label, p->u2.statements, mother_exten, this_context)) { /* this will link in all the statements here */
return -1;
}
-
+
if (p->u3.else_statements) {
linkprio(exten, if_skip, mother_exten);
if (gen_prios(exten, new_label, p->u3.else_statements, mother_exten, this_context)) { /* this will link in all the statements here */
return -1;
}
}
-
+
linkprio(exten, if_end, mother_exten);
-
+
break;
case PV_STATEMENTBLOCK:
switch_case->has_switch = exten->has_switch;
switch_case->checked_switch = exten->checked_switch;
}
-
+
switch_case->context = this_context;
linkexten(exten,switch_case);
switch_case->name = strdup(p->u1.str);
snprintf(new_label, BUF_SIZE, "catch_%s_%d",p->u1.str, control_statement_count);
-
+
if (gen_prios(switch_case, new_label, p->u2.statements, mother_exten,this_context)) { /* this will link in all the catch body statements here */
return -1;
}
i=2;
else
i=1;
-
+
for (pr=exten->plist; pr; pr=pr->next) {
pr->priority_num = i;
-
+
if (!pr->origin || (pr->origin && pr->origin->type != PV_LABEL) ) /* Labels don't show up in the dialplan,
but we want them to point to the right
priority, which would be the next line
after the label; */
i++;
}
-
+
exten = exten->next_exten;
} while ( exten );
}
}
do {
struct ael_priority *last = 0;
-
+
pbx_substitute_variables_helper(NULL, exten->name, realext, sizeof(realext) - 1);
if (exten->hints) {
- if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, PRIORITY_HINT, NULL, exten->cidmatch,
+ if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, PRIORITY_HINT, NULL, exten->cidmatch,
exten->hints, NULL, ast_free_ptr, registrar)) {
ast_log(LOG_WARNING, "Unable to add step at priority 'hint' of extension '%s'\n",
exten->name);
}
}
-
+
for (pr=exten->plist; pr; pr=pr->next) {
char app[2000];
char appargs[2000];
last = pr;
continue;
}
-
+
if (pr->app)
strcpy(app, pr->app);
else
case AEL_APPCALL:
/* easy case. Everything is all set up */
break;
-
+
case AEL_CONTROL1: /* FOR loop, WHILE loop, BREAK, CONTINUE, IF, IFTIME */
/* simple, unconditional goto. */
strcpy(app,"Goto");
} else
snprintf(appargs,sizeof(appargs),"%d", pr->goto_true->priority_num);
break;
-
+
case AEL_FOR_CONTROL: /* WHILE loop test, FOR loop test */
strcpy(app,"GotoIf");
snprintf(appargs,sizeof(appargs),"%s?%d:%d", pr->appargs, pr->priority_num+1, pr->goto_false->priority_num);
break;
-
+
case AEL_IF_CONTROL:
strcpy(app,"GotoIf");
if (pr->origin->u3.else_statements )
strcpy(app,"Return");
appargs[0] = 0;
break;
-
+
default:
break;
}
}
else
label = 0;
-
- if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, pr->priority_num, (label?label:NULL), exten->cidmatch,
+
+ if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, pr->priority_num, (label?label:NULL), exten->cidmatch,
app, strdup(appargs), ast_free_ptr, registrar)) {
- ast_log(LOG_WARNING, "Unable to add step at priority '%d' of extension '%s'\n", pr->priority_num,
+ ast_log(LOG_WARNING, "Unable to add step at priority '%d' of extension '%s'\n", pr->priority_num,
exten->name);
}
last = pr;
return;
}
lptr = *list;
-
+
while( lptr->next_exten ) {
lptr = lptr->next_exten;
}
static pval *get_extension_or_contxt(pval *p)
{
while( p && p->type != PV_EXTENSION && p->type != PV_CONTEXT && p->type != PV_MACRO ) {
-
+
p = p->dad;
}
-
+
return p;
}
static pval *get_contxt(pval *p)
{
while( p && p->type != PV_CONTEXT && p->type != PV_MACRO ) {
-
+
p = p->dad;
}
-
+
return p;
}
struct ael_priority *p;
for(p=e->plist;p;p=p->next) {
-
+
if( p->origin && p->origin->type == PV_GOTO && p->origin->u3.goto_target_in_case ) {
-
+
/* fix the extension of the goto target to the actual extension in the post-compiled dialplan */
pval *target = p->origin->u2.goto_target;
pval *pv2 = p->origin;
char buf1[500];
char *apparg_save = p->appargs;
-
+
p->appargs = 0;
if (!pv2->u1.list->next) /* just one -- it won't hurt to repeat the extension */ {
snprintf(buf1,sizeof(buf1),"%s,%s", z->name, pv2->u1.list->u1.str);
p->appargs = strdup(buf1);
-
+
} else if (pv2->u1.list->next && !pv2->u1.list->next->next) /* two */ {
snprintf(buf1,sizeof(buf1),"%s,%s", z->name, pv2->u1.list->next->u1.str);
p->appargs = strdup(buf1);
} else if (pv2->u1.list->next && pv2->u1.list->next->next) {
- snprintf(buf1,sizeof(buf1),"%s,%s,%s", pv2->u1.list->u1.str,
+ snprintf(buf1,sizeof(buf1),"%s,%s,%s", pv2->u1.list->u1.str,
z->name,
pv2->u1.list->next->next->u1.str);
p->appargs = strdup(buf1);
}
else
printf("WHAT? The goto doesn't fall into one of three cases for GOTO????\n");
-
+
if( apparg_save ) {
free(apparg_save);
}
for (p=root; p; p=p->next ) {
pval *lp;
int argc;
-
+
switch (p->type) {
case PV_MACRO:
-
+
context = ast_context_find_or_create(local_contexts, local_table, p->u1.str, registrar);
-
+
exten = new_exten();
exten->context = context;
exten->name = strdup("~~s~~");
np2->appargs = strdup(buf);
linkprio(exten, np2, NULL);
}
-
+
/* CONTAINS APPCALLS, CATCH, just like extensions... */
if (gen_prios(exten, p->u1.str, p->u3.macro_statements, 0, context)) {
return -1;
linkprio(exten, np2, NULL);
exten-> return_target = np2;
}
-
+
set_priorities(exten);
attach_exten(&exten_list, exten);
break;
-
+
case PV_GLOBALS:
/* already done */
break;
-
+
case PV_CONTEXT:
context = ast_context_find_or_create(local_contexts, local_table, p->u1.str, registrar);
-
+
/* contexts contain: ignorepat, includes, switches, eswitches, extensions, */
for (p2=p->u2.statements; p2; p2=p2->next) {
pval *p3;
char *s3;
-
+
switch (p2->type) {
case PV_EXTENSION:
exten = new_exten();
exten->name = strdup(p2->u1.str);
exten->context = context;
-
+
if( (s3=strchr(exten->name, '/') ) != 0 )
{
*s3 = 0;
exten->cidmatch = s3+1;
}
-
+
if ( p2->u3.hints )
exten->hints = strdup(p2->u3.hints);
exten->regexten = p2->u4.regexten;
set_priorities(exten);
attach_exten(&exten_list, exten);
break;
-
+
case PV_IGNOREPAT:
ast_context_add_ignorepat2(context, p2->u1.str, registrar);
break;
-
+
case PV_INCLUDES:
for (p3 = p2->u1.list; p3 ;p3=p3->next) {
if ( p3->u2.arglist ) {
- snprintf(buf,sizeof(buf), "%s,%s,%s,%s,%s",
+ snprintf(buf,sizeof(buf), "%s,%s,%s,%s,%s",
p3->u1.str,
p3->u2.arglist->u1.str,
p3->u2.arglist->next->u1.str,
ast_context_add_include2(context, p3->u1.str, registrar);
}
break;
-
+
case PV_SWITCHES:
for (p3 = p2->u1.list; p3 ;p3=p3->next) {
char *c = strchr(p3->u1.str, '/');
break;
}
}
-
+
break;
-
+
default:
/* huh? what? */
break;
-
+
}
}
fix_gotos_in_extensions(exten_list); /* find and fix extension ref in gotos to labels that are in case statements */
add_extensions(exten_list); /* actually makes calls to create priorities in ast_contexts -- feeds dialplan to asterisk */
destroy_extensions(exten_list); /* all that remains is an empty husk, discard of it as is proper */
-
+
return 0;
}
if (item->filename)
free(item->filename);
-
+
switch (item->type) {
case PV_WORD:
/* fields: item->u1.str == string associated with this (word). */
if ( item->u2.arglist )
destroy_pval(item->u2.arglist);
break;
-
+
case PV_MACRO:
/* fields: item->u1.str == name of macro
item->u2.arglist == pval list of PV_WORD arguments of macro, as given by user
free(item->u1.str);
destroy_pval(item->u3.macro_statements);
break;
-
+
case PV_CONTEXT:
/* fields: item->u1.str == name of context
item->u2.statements == pval list of statements in context body
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_MACRO_CALL:
/* fields: item->u1.str == name of macro to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
free(item->u1.str);
destroy_pval(item->u2.arglist);
break;
-
+
case PV_APPLICATION_CALL:
/* fields: item->u1.str == name of application to call
item->u2.arglist == pval list of PV_WORD arguments of macro call, as given by user
free(item->u1.str);
destroy_pval(item->u2.arglist);
break;
-
+
case PV_CASE:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_PATTERN:
/* fields: item->u1.str == value of case
item->u2.statements == pval list of statements under the case
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_DEFAULT:
- /* fields:
+ /* fields:
item->u2.statements == pval list of statements under the case
*/
destroy_pval(item->u2.statements);
break;
-
+
case PV_CATCH:
/* fields: item->u1.str == name of extension to catch
item->u2.statements == pval list of statements in context body
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_SWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
destroy_pval(item->u1.list);
break;
-
+
case PV_ESWITCHES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
*/
destroy_pval(item->u1.list);
break;
-
+
case PV_INCLUDES:
/* fields: item->u1.list == pval list of PV_WORD elements, one per entry in the list
item->u2.arglist == pval list of 4 PV_WORD elements for time values
*/
destroy_pval(item->u1.list);
break;
-
+
case PV_STATEMENTBLOCK:
/* fields: item->u1.list == pval list of statements in block, one per entry in the list
*/
destroy_pval(item->u1.list);
break;
-
+
case PV_LOCALVARDEC:
case PV_VARDEC:
/* fields: item->u1.str == variable name
if (item->u2.val)
free(item->u2.val);
break;
-
+
case PV_GOTO:
/* fields: item->u1.list == pval list of PV_WORD target names, up to 3, in order as given by user.
item->u1.list->u1.str == where the data on a PV_WORD will always be.
*/
-
+
destroy_pval(item->u1.list);
break;
-
+
case PV_LABEL:
/* fields: item->u1.str == label name
*/
if (item->u1.str)
free(item->u1.str);
break;
-
+
case PV_FOR:
/* fields: item->u1.for_init == a string containing the initalizer
item->u2.for_test == a string containing the loop test
free(item->u3.for_inc);
destroy_pval(item->u4.for_statements);
break;
-
+
case PV_WHILE:
/* fields: item->u1.str == the while conditional, as supplied by user
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_BREAK:
/* fields: none
*/
break;
-
+
case PV_RETURN:
/* fields: none
*/
break;
-
+
case PV_CONTINUE:
/* fields: none
*/
break;
-
+
case PV_IFTIME:
/* fields: item->u1.list == the 4 time values, in PV_WORD structs, linked list
destroy_pval(item->u3.else_statements);
}
break;
-
+
case PV_RANDOM:
/* fields: item->u1.str == the random percentage, as supplied by user
destroy_pval(item->u3.else_statements);
}
break;
-
+
case PV_SWITCH:
/* fields: item->u1.str == the switch expression
- item->u2.statements == a pval list of statements in the switch,
+ item->u2.statements == a pval list of statements in the switch,
(will be case statements, most likely!)
*/
if (item->u1.str)
free(item->u1.str);
destroy_pval(item->u2.statements);
break;
-
+
case PV_EXTENSION:
/* fields: item->u1.str == the extension name, label, whatever it's called
free(item->u3.hints);
destroy_pval(item->u2.statements);
break;
-
+
case PV_IGNOREPAT:
/* fields: item->u1.str == the ignorepat data
*/
if (item->u1.str)
free(item->u1.str);
break;
-
+
case PV_GLOBALS:
/* fields: item->u1.statements == pval list of statements, usually vardecs
*/
free(item);
}
-void destroy_pval(pval *item)
+void destroy_pval(pval *item)
{
pval *i,*nxt;
-
+
for (i=item; i; i=nxt) {
nxt = i->next;
-
+
destroy_pval_item(i);
}
}
int s,t;
t = sizeof(ael_funclist)/sizeof(char*);
s = 0;
- while ((s < t) && strcasecmp(name, ael_funclist[s]))
+ while ((s < t) && strcasecmp(name, ael_funclist[s]))
s++;
if ( s < t )
return 1;
else
return 0;
}
-#endif
+#endif
/* PVAL PI */
else
linku1(p->u3.macro_statements, statement);
-
+
}
pval *pvalMacroWalkStatements( pval *p, pval **next_statement )
void pvalGotoSetTarget( pval *p, char *context, char *exten, char *label )
{
pval *con, *ext, *pri;
-
+
if (!pvalCheckType(p, "pvalGotoSetTarget", PV_GOTO))
return;
if (context && strlen(context)) {
con = pvalCreateNode(PV_WORD);
ext = pvalCreateNode(PV_WORD);
pri = pvalCreateNode(PV_WORD);
-
+
con->u1.str = context;
ext->u1.str = exten;
pri->u1.str = label;
-
+
con->next = ext;
ext->next = pri;
p->u1.list = con;
} else if (exten && strlen(exten)) {
ext = pvalCreateNode(PV_WORD);
pri = pvalCreateNode(PV_WORD);
-
+
ext->u1.str = exten;
pri->u1.str = label;
-
+
ext->next = pri;
p->u1.list = ext;
} else {
pri = pvalCreateNode(PV_WORD);
-
+
pri->u1.str = label;
-
+
p->u1.list = pri;
}
}
*context = p->u1.list->u1.str;
*exten = p->u1.list->next->u1.str;
*label = p->u1.list->next->next->u1.str;
-
+
} else if (p->u1.list && p->u1.list->next ) {
*exten = p->u1.list->u1.str;
*label = p->u1.list->next->u1.str;
*label = p->u1.list->u1.str;
*context = 0;
*exten = 0;
-
+
} else {
*context = 0;
*exten = 0;
}
return head;
}
-
/*! @} */
/*!
- * \brief Function type for validator functions. Allows for
+ * \brief Function type for validator functions. Allows for
*/
typedef int (*ari_validator)(struct ast_json *json);
"{" \
" \"error\": \"InvalidMessage\"," \
" \"message\": \"Message validation failed\"" \
- "}"
+ "}"
int ast_ari_websocket_session_write(struct ast_ari_websocket_session *session,
struct ast_json *message)
if (!session) {
return;
}
-
+
/* Determine if we've been replaced */
if (strcmp(msg_type, "ApplicationReplaced") == 0 &&
strcmp(msg_application, app_name) == 0) {
"Error processing request");
}
}
-
* \brief Shareable AEL code -- mainly between internal and external modules
*
* \author Steve Murphy <murf@digium.com>
- *
+ *
* \ingroup applications
*/
/*! \file
* \brief Calendaring API
- *
+ *
* \todo Support responding to a meeting invite
* \todo Support writing attendees
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page calendar.conf calendar.conf
* \verbinclude calendar.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
return response;
}
-static time_t icalfloat_to_timet(icaltimetype time)
+static time_t icalfloat_to_timet(icaltimetype time)
{
struct ast_tm tm = {0,};
struct timeval tv;
return comp;
}
-static time_t icalfloat_to_timet(icaltimetype time)
+static time_t icalfloat_to_timet(icaltimetype time)
{
struct ast_tm tm = {0,};
struct timeval tv;
* \brief CLI Aliases
*
* \author\verbatim Joshua Colp <jcolp@digium.com> \endverbatim
- *
+ *
* This module provides the capability to create aliases to other
* CLI commands.
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page cli_aliases.conf cli_aliases.conf
* \verbinclude cli_aliases.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* \author Tilghman Lesher <res_config_curl_v1@the-tilghman.com>
*
* Depends on the CURL library - http://curl.haxx.se/
- *
+ *
*/
/*** MODULEINFO
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page res_ldap.conf res_ldap.conf
* \verbinclude res_ldap.conf.sample
*/
int var_metric; /*!< For organizing variables (particularly includes and switch statments) within a context */
};
-/*! \brief Table configuration
+/*! \brief Table configuration
*/
struct ldap_table_config {
char *table_name; /*!< table name */
/* TODO: Make proxies work */
};
-/*! \brief Should be locked before using it
+/*! \brief Should be locked before using it
*/
static AST_LIST_HEAD_NOLOCK_STATIC(table_configs, ldap_table_config);
static struct ldap_table_config *base_table_config;
/*! \brief Find a table_config
*
- * Should be locked before using it
+ * Should be locked before using it
*
* \note This function assumes ldap_lock to be locked.
*/
}
/* \brief Count semicolons in variables
- *
+ *
* takes a linked list of \a ast_variable variables, finds the one with the name variable_value
* and returns the number of semicolons in the value for that \a ast_variable
*/
return attribute_name;
}
-/*! \brief Convert ldap attribute name to variable name
+/*! \brief Convert ldap attribute name to variable name
*
* \note Should be locked before using it
*/
return attribute_name;
}
-/*! \brief Get variables from ldap entry attributes
+/*! \brief Get variables from ldap entry attributes
* \note Should be locked before using it
* \return a linked list of ast_variable variables.
*/
/*! \brief Get variables from ldap entry attributes - Should be locked before using it
*
* The results are freed outside this function so is the \a vars array.
- *
+ *
* \return \a vars - an array of ast_variable variables terminated with a null.
*/
static struct ast_variable **realtime_ldap_result_to_vars(struct ldap_table_config *table_config,
*/
ldap_entry = ldap_first_entry(ldapConn, ldap_result_msg);
- for (tot_count = 0; ldap_entry; tot_count++) {
+ for (tot_count = 0; ldap_entry; tot_count++) {
struct ast_variable *tmp = realtime_ldap_entry_to_var(table_config, ldap_entry);
tot_count += semicolon_count_var(tmp);
ldap_entry = ldap_next_entry(ldapConn, ldap_entry);
/*! \brief Get LDAP entry by dn and return attributes as variables
*
- * Should be locked before using it
+ * Should be locked before using it
*
* This is used for setting the default values of an object
* i.e., with accountBaseDN
return cbasedn;
}
-/*! \brief Replace \<search\> by \<by\> in string.
+/*! \brief Replace \<search\> by \<by\> in string.
* \note No check is done on string allocated size !
*/
static int replace_string_in_string(char *string, const char *search, const char *by)
return replaced;
}
-/*! \brief Append a name=value filter string. The filter string can grow.
+/*! \brief Append a name=value filter string. The filter string can grow.
*/
static void append_var_and_value_to_filter(struct ast_str **filter,
struct ldap_table_config *table_config,
return filter;
}
-/*! \brief LDAP base function
+/*! \brief LDAP base function
* \return a null terminated array of ast_variable (one per entry) or NULL if no entry is found or if an error occured
* caller should free the returned array and ast_variables
* \param entries_count_ptr is a pointer to found entries count (can be NULL)
ast_log(LOG_ERROR, "No table_name specified.\n");
ast_free(clean_basedn);
return NULL;
- }
+ }
if (!field) {
ast_log(LOG_ERROR, "Realtime retrieval requires at least 1 parameter"
ast_log(LOG_WARNING, "Failed to query directory. Error: %s.\n", ldap_err2string(result));
ast_log(LOG_WARNING, "Query: %s\n", ast_str_buffer(filter));
} else {
- /* this is where we create the variables from the search result
+ /* this is where we create the variables from the search result
* freeing this \a vars outside this function */
if (ldap_count_entries(ldapConn, ldap_result_msg) > 0) {
/* is this a static var or some other? they are handled different for delimited values */
if (strcasecmp(tmp->name, "accountBaseDN") == 0) {
/* Get the variable to compare with for the defaults */
struct ast_variable *base_var = ldap_loadentry(table_config, tmp->value);
-
+
while (base_var) {
struct ast_variable *next = base_var->next;
struct ast_variable *test_var = *p;
return 1;
} else if (as->metric == bs->metric && strcmp(as->name, bs->name) != 0) {
return strcmp(as->name, bs->name);
- }
+ }
/* if the metric and the category name is the same, we check the variable metric */
if (as->var_metric < bs->var_metric) {
return -1;
/*! \brief See Asterisk Realtime Documentation
*
* This is for Static Realtime
- *
+ *
* load the configuration stuff for the .conf files
* called on a reload
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*
* \todo Don't error or warn on a default install. If the config is
ast_log(LOG_NOTICE, "Cannot reload LDAP RealTime driver.\n");
ast_mutex_unlock(&ldap_lock);
return 0;
- }
+ }
if (!ldap_reconnect()) {
ast_log(LOG_WARNING, "Couldn't establish connection to your directory server. Check debug.\n");
if (!(s = ast_variable_retrieve(config, "_general", "basedn"))) {
ast_log(LOG_ERROR, "No LDAP base dn found, using '%s' as default.\n", RES_CONFIG_LDAP_DEFAULT_BASEDN);
ast_copy_string(base_distinguished_name, RES_CONFIG_LDAP_DEFAULT_BASEDN, sizeof(base_distinguished_name));
- } else
+ } else
ast_copy_string(base_distinguished_name, s, sizeof(base_distinguished_name));
if (!(s = ast_variable_retrieve(config, "_general", "version")) && !(s = ast_variable_retrieve(config, "_general", "protocol"))) {
int is_general = (strcasecmp(category_name, "_general") == 0);
int is_config = (strcasecmp(category_name, "config") == 0); /*!< using the [config] context for Static RealTime */
struct ast_variable *var = ast_variable_browse(config, category_name);
-
+
if (var) {
struct ldap_table_config *table_config =
table_config_for_table_name(category_name);
if (!ldapConn)
return CLI_FAILURE;
- if (!ast_strlen_zero(url))
+ if (!ast_strlen_zero(url))
snprintf(status, sizeof(status), "Connected to '%s', baseDN %s", url, base_distinguished_name);
if (!ast_strlen_zero(user))
ENCODE_CHUNK(encodebuf, newval);
ast_string_field_set(cps, encoding[x], encodebuf);
newval = cps->encoding[x];
- }
+ }
SQLBindParameter(stmt, x++, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, strlen(newval), 0, (void *)newval, 0, NULL);
}
for (x = 0; x < colcount; x++) {
colsize = 0;
collen = sizeof(coltitle);
- res = SQLDescribeCol(stmt, x + 1, (unsigned char *)coltitle, sizeof(coltitle), &collen,
+ res = SQLDescribeCol(stmt, x + 1, (unsigned char *)coltitle, sizeof(coltitle), &collen,
&datatype, &colsize, &decimaldigits, &nullable);
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
ast_log(LOG_WARNING, "SQL Describe Column error! [%s]\n", ast_str_buffer(sql));
* \param ap list containing one or more field/operator/value set.
*
* Select database and preform query on table, prepare the sql statement
- * Sub-in the values to the prepared statement and execute it.
+ * Sub-in the values to the prepared statement and execute it.
* Execute this prepared query against several ODBC connected databases.
* Return results as an ast_config variable.
*
for (x=0;x<colcount;x++) {
colsize = 0;
collen = sizeof(coltitle);
- res = SQLDescribeCol(stmt, x + 1, (unsigned char *)coltitle, sizeof(coltitle), &collen,
+ res = SQLDescribeCol(stmt, x + 1, (unsigned char *)coltitle, sizeof(coltitle), &collen,
&datatype, &colsize, &decimaldigits, &nullable);
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
ast_log(LOG_WARNING, "SQL Describe Column error! [%s]\n", ast_str_buffer(sql));
return NULL;
}
continue;
- }
+ }
if (strcmp(last, q.category) || last_cat_metric != q.cat_metric) {
cur_cat = ast_category_new_dynamic(q.category);
if (!cur_cat) {
* res_config_sqlite is a module for the Asterisk Open Source PBX to
* support SQLite 2 databases. It can be used to fetch configuration
* from a database (static configuration files and/or using the Asterisk
- * RealTime Architecture - ARA). It can also be used to log CDR entries.
+ * RealTime Architecture - ARA). It can also be used to log CDR entries.
* Note that Asterisk already comes with a module named cdr_sqlite.
* There are two reasons for including it in res_config_sqlite:
* the first is that rewriting it was a training to learn how to write a
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page res_config_sqlite.conf res_config_sqlite.conf
* \verbinclude res_config_sqlite.conf.sample
*/
* \brief Asterisk callback function for the CLI status command.
*
* \param e CLI command
- * \param cmd
+ * \param cmd
* \param a CLI argument list
* \return RESULT_SUCCESS
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page res_config_sqlite3.conf res_config_sqlite3.conf
* \verbinclude res_config_sqlite3.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
*/
/*! \file
- *
+ *
* \brief file format conversion CLI command using Asterisk formats and translators
*
* \author redice li <redice_li@yahoo.com>
* \author Russell Bryant <russell@digium.com>
*
- */
+ */
/*** MODULEINFO
<support_level>core</support_level>
static int split_ext(char *filename, char **name, char **ext)
{
*name = *ext = filename;
-
+
if ((*ext = strrchr(filename, '.'))) {
**ext = '\0';
(*ext)++;
return 0;
}
-/*!
- * \brief Convert a file from one format to another
+/*!
+ * \brief Convert a file from one format to another
* \param e CLI entry
* \param cmd command number
* \param a list of cli arguments
case CLI_GENERATE:
return NULL;
}
-
+
/* ugly, can be removed when CLI entries have ast_module pointers */
ast_module_ref(ast_module_info->self);
if (a->argc != 4 || ast_strlen_zero(a->argv[2]) || ast_strlen_zero(a->argv[3])) {
ret = CLI_SHOWUSAGE;
- goto fail_out;
+ goto fail_out;
}
file_in = ast_strdupa(a->argv[2]);
ast_cli(a->fd, "Unable to open input file: %s\n", a->argv[2]);
goto fail_out;
}
-
+
if (split_ext(file_out, &name_out, &ext_out)) {
ast_cli(a->fd, "'%s' is an invalid filename!\n", a->argv[3]);
goto fail_out;
}
start = ast_tvnow();
-
+
while ((f = ast_readframe(fs_in))) {
if (ast_writestream(fs_out, f)) {
ast_frfree(f);
ast_filedelete(name_out, ext_out);
}
- if (fs_in)
+ if (fs_in)
ast_closestream(fs_in);
ast_module_unref(ast_module_info->self);
}
AST_MODULE_INFO_STANDARD_EXTENDED(ASTERISK_GPL_KEY, "Corosync");
-
* \author Tilghman Lesher <res_curl_v1@the-tilghman.com>
*
* Depends on the CURL library - http://curl.haxx.se/
- *
+ *
*/
/*! \li \ref res_curl.c uses the configuration file \ref res_curl.conf
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page res_curl.conf res_curl.conf
* \verbinclude res_curl.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
t38_set_fill_bit_removal(p->t38_core_state, t38_param->fill_bit_removal);
t38_set_mmr_transcoding(p->t38_core_state, t38_param->transcoding_mmr);
t38_set_jbig_transcoding(p->t38_core_state, t38_param->transcoding_jbig);
- t38_set_data_rate_management_method(p->t38_core_state,
+ t38_set_data_rate_management_method(p->t38_core_state,
(t38_param->rate_management == AST_T38_RATE_MANAGEMENT_TRANSFERRED_TCF)? 1 : 2);
t38_gateway_set_transmit_on_idle(&p->t38_gw_state, TRUE);
t38_gateway_set_supported_modems(&p->t38_gw_state, spandsp_modems(s->details));
- /* engage udptl nat on other side of T38 line
+ /* engage udptl nat on other side of T38 line
* (Asterisk changes media ports thus we send a few packets to reinitialize
* pinholes in NATs and FWs
*/
return;
}
- if ((attr->maxbitrate > 5000) && (attr->maxbitrate < 40000)) {
+ if ((attr->maxbitrate > 5000) && (attr->maxbitrate < 40000)) {
ast_str_append(str, 0, "a=fmtp:%u maxaveragebitrate=%u\r\n", payload, attr->maxbitrate);
}
*/
/*!
- * \file
+ * \file
* \brief HTTP POST upload support for Asterisk HTTP server
*
* \author Terry Wilson <twilson@digium.com
parser = g_mime_parser_new_with_stream(stream);
g_mime_parser_set_respect_content_length(parser, 1);
-
+
g_object_unref(stream);
message = g_mime_parser_construct_message(parser
* Asterisk -- An open source telephony toolkit.
*
* Resource limits
- *
+ *
* Copyright (c) 2006 Tilghman Lesher. All rights reserved.
*
* Tilghman Lesher <res_limit_200607@the-tilghman.com>
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Resource limits");
-
<depend type="module">func_periodic_hook</depend>
<support_level>core</support_level>
***/
-
+
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
static unsigned long seq = 0;
-/*!
- * \brief Change state of monitored channel
- * \param chan
+/*!
+ * \brief Change state of monitored channel
+ * \param chan
* \param state monitor state
* \retval 0 on success.
* \retval -1 on failure.
} else {
monitor->format = ast_strdup("wav");
}
-
+
/* open files */
if (stream_action & X_REC_IN) {
if (ast_fileexists(monitor->read_filename, NULL, NULL) > 0)
res = "ul";
if (!strcasecmp(format,"alaw"))
res = "al";
-
+
return res;
}
-/*!
- * \brief Stop monitoring channel
- * \param chan
+/*!
+ * \brief Stop monitoring channel
+ * \param chan
* \param need_lock
* Stop the recording, close any open streams, mix in/out channels if required
* \return Always 0
#endif
format = get_soxmix_format(format);
delfiles = 1;
- }
+ }
execute_args = pbx_builtin_getvar_helper(chan, "MONITOR_EXEC_ARGS");
if (ast_strlen_zero(execute_args)) {
execute_args = "";
return ast_monitor_unpause(chan);
}
-/*!
- * \brief Change monitored filename of channel
+/*!
+ * \brief Change monitored filename of channel
* \param chan
* \param fname_base new filename
* \param need_lock
* and we aren't interfering with the recording itself.
*/
ast_debug(2, "comparing tmpstring %s to filename_base %s\n", tmpstring, ast_channel_monitor(chan)->filename_base);
-
+
if ((fd[0] = open(tmpstring, O_CREAT | O_WRONLY, 0644)) < 0 ||
(fd[1] = open(ast_channel_monitor(chan)->filename_base, O_CREAT | O_EXCL | O_WRONLY, 0644)) < 0) {
if (fd[0] < 0) {
AST_APP_ARG(fname_base);
AST_APP_ARG(options);
);
-
+
/* Parse arguments. */
if (ast_strlen_zero(data)) {
ast_log(LOG_ERROR, "Monitor requires an argument\n");
/*! \file
*
* \brief Routines implementing music on hold
- *
+ *
* \author Mark Spencer <markster@digium.com>
*/
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page musiconhold.conf musiconhold.conf
* \verbinclude musiconhold.conf.sample
*/
state->class = mohclass_unref(state->class, "Unreffing channel's music class upon deactivation of generator");
}
-static int ast_moh_files_next(struct ast_channel *chan)
+static int ast_moh_files_next(struct ast_channel *chan)
{
struct moh_files_state *state = ast_channel_music_state(chan);
int tries;
DIR *dir = NULL;
struct dirent *de;
-
+
if (!strcasecmp(class->dir, "nodir")) {
files = 1;
} else {
argv[argc++] = "--mono";
argv[argc++] = "-r";
argv[argc++] = "8000";
-
+
if (!ast_test_flag(class, MOH_SINGLE)) {
argv[argc++] = "-b";
argv[argc++] = "2048";
}
-
+
argv[argc++] = "-f";
-
+
if (ast_test_flag(class, MOH_QUIET))
argv[argc++] = "4096";
else
argv[argc++] = "8192";
-
+
/* Look for extra arguments and add them to the list */
ast_copy_string(xargs, class->args, sizeof(xargs));
argptr = xargs;
files++;
} else if (dir) {
while ((de = readdir(dir)) && (files < MAX_MP3S)) {
- if ((strlen(de->d_name) > 3) &&
- ((ast_test_flag(class, MOH_CUSTOM) &&
- (!strcasecmp(de->d_name + strlen(de->d_name) - 4, ".raw") ||
+ if ((strlen(de->d_name) > 3) &&
+ ((ast_test_flag(class, MOH_CUSTOM) &&
+ (!strcasecmp(de->d_name + strlen(de->d_name) - 4, ".raw") ||
!strcasecmp(de->d_name + strlen(de->d_name) - 4, ".sln"))) ||
!strcasecmp(de->d_name + strlen(de->d_name) - 4, ".mp3"))) {
ast_copy_string(fns[files], de->d_name, sizeof(fns[files]));
if (dir) {
closedir(dir);
}
- if (pipe(fds)) {
+ if (pipe(fds)) {
ast_log(LOG_WARNING, "Pipe failed\n");
return -1;
}
AST_STANDARD_APP_ARGS(args, parse);
class = S_OR(args.class, NULL);
- if (ast_moh_start(chan, class, NULL))
+ if (ast_moh_start(chan, class, NULL))
ast_log(LOG_WARNING, "Unable to start music on hold class '%s' on channel %s\n", class, ast_channel_name(chan));
return 0;
ao2_lock(cl);
AST_LIST_INSERT_HEAD(&cl->members, moh, list);
ao2_unlock(cl);
-
+
return moh;
}
struct ast_format *oldwfmt;
ao2_lock(class);
- AST_LIST_REMOVE(&moh->parent->members, moh, list);
+ AST_LIST_REMOVE(&moh->parent->members, moh, list);
ao2_unlock(class);
-
+
close(moh->pipe[0]);
close(moh->pipe[1]);
}
return -1;
}
- } else if (!strcasecmp(moh->mode, "mp3") || !strcasecmp(moh->mode, "mp3nb") ||
- !strcasecmp(moh->mode, "quietmp3") || !strcasecmp(moh->mode, "quietmp3nb") ||
+ } else if (!strcasecmp(moh->mode, "mp3") || !strcasecmp(moh->mode, "mp3nb") ||
+ !strcasecmp(moh->mode, "quietmp3") || !strcasecmp(moh->mode, "quietmp3nb") ||
!strcasecmp(moh->mode, "httpmp3") || !strcasecmp(moh->mode, "custom")) {
if (init_app_class(moh)) {
if (unref) {
if (!strcasecmp(tmp->name, "name"))
ast_copy_string(mohclass->name, tmp->value, sizeof(mohclass->name));
else if (!strcasecmp(tmp->name, "mode"))
- ast_copy_string(mohclass->mode, tmp->value, sizeof(mohclass->mode));
+ ast_copy_string(mohclass->mode, tmp->value, sizeof(mohclass->mode));
else if (!strcasecmp(tmp->name, "directory"))
ast_copy_string(mohclass->dir, tmp->value, sizeof(mohclass->dir));
else if (!strcasecmp(tmp->name, "application"))
ast_set2_flag(mohclass, ast_true(tmp->value), MOH_RANDOMIZE);
else if (!strcasecmp(tmp->name, "sort") && !strcasecmp(tmp->value, "random"))
ast_set_flag(mohclass, MOH_RANDOMIZE);
- else if (!strcasecmp(tmp->name, "sort") && !strcasecmp(tmp->value, "alpha"))
+ else if (!strcasecmp(tmp->name, "sort") && !strcasecmp(tmp->value, "alpha"))
ast_set_flag(mohclass, MOH_SORTALPHA);
else if (!strcasecmp(tmp->name, "format")) {
ao2_cleanup(mohclass->format);
stime = time(NULL) + 2;
killpid(class->pid, class->kill_delay, class->kill_method);
- while ((ast_wait_for_input(class->srcfd, 100) > 0) &&
+ while ((ast_wait_for_input(class->srcfd, 100) > 0) &&
(bytes = read(class->srcfd, buff, 8192)) && time(NULL) < stime) {
tbytes = tbytes + bytes;
}
}
}
/* These names were deprecated in 1.4 and should not be used until after the next major release. */
- if (!strcasecmp(cat, "classes") || !strcasecmp(cat, "moh_files") ||
+ if (!strcasecmp(cat, "classes") || !strcasecmp(cat, "moh_files") ||
!strcasecmp(cat, "general")) {
continue;
}
ast_config_destroy(cfg);
- ao2_t_callback(mohclasses, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE,
+ ao2_t_callback(mohclasses, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE,
moh_classes_delete_marked, NULL, "Purge marked classes");
return numclasses;
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
.load = load_module,
.unload = unload_module,
);
-
/*! \file
*
* \brief ODBC resource manager
- *
+ *
* \author Mark Spencer <markster@digium.com>
* \author Anthony Minessale II <anthmct@yahoo.com>
* \author Tilghman Lesher <tilghman@digium.com>
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page res_odbc.conf res_odbc.conf
* \verbinclude res_odbc.conf.sample
*/
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
/* No datastore? Definitely no transaction then */
return NULL;
}
-
+
oldlist = txn_store->data;
AST_LIST_LOCK(oldlist);
* \addtogroup configuration_file Configuration Files
*/
-/*!
+/*!
* \page phoneprov.conf phoneprov.conf
* \verbinclude phoneprov.conf.sample
*/
static struct header *alloc_header(const char *name, const char *value)
{
struct header *alloc;
-
+
alloc = ast_calloc_with_stringfields(1, struct header, 32);
if (!alloc) {
}
AST_RWLIST_WRLOCK(headers);
- if (replace) {
+ if (replace) {
remove_header(headers, name);
}
if (to_add) {
astman_append(ami->s, "%s\r\n", ast_str_buffer(buf));
ami->count++;
-
+
ast_free(buf);
ao2_cleanup(status);
return 0;
pj_str_t **p_st_text, pjsip_hdr *res_hdr, pjsip_msg_body **p_body);
static void pubsub_on_client_refresh(pjsip_evsub *sub);
static void pubsub_on_server_timeout(pjsip_evsub *sub);
-
+
static pjsip_evsub_user pubsub_cb = {
.on_evsub_state = pubsub_on_evsub_state,
.on_rx_refresh = pubsub_on_rx_refresh,
/*!\file
*
* \brief PacketCable COPS
- *
+ *
* \author Attila Domjan <attila.domjan.hu@gmail.com>
*
- * \note
+ * \note
* This module is an add-on to chan_mgcp. It adds support for the
* PacketCable MGCP variation called NCS. Res_pktccops implements COPS
* (RFC 2748), a protocol used to manage dynamic bandwith allocation in
unsigned char cnum;
unsigned char ctype;
char *contents;
- struct pktcobj *next;
+ struct pktcobj *next;
};
struct copsmsg {
char name[80];
char host[80];
char port[80];
- uint16_t t1;
+ uint16_t t1;
uint16_t t7;
uint16_t t8;
uint32_t keepalive;
if (res == NULL) {
return 0;
}
-
+
*res = (char) gs->direction;
*(res + 1) = (char) gs->protocolid;
*(res + 2) = (char) gs->flags;
{
struct gatespec gs;
int offset = 0;
-
+
ast_debug(3, "CMD: %d\n", cmd);
/* Transaction Identifier 8 octets */
*(p + offset++) = 1; /* stype */
*((uint32_t *) (p + offset)) = htonl(mtahost);
offset += 4;
-
+
if (cmd == GATE_INFO || cmd == GATE_SET_HAVE_GATEID || cmd == GATE_DEL) {
/* Gate ID 8 Octets */
*(p + offset++) = 0;
if (cmd == GATE_INFO || cmd == GATE_DEL) {
return offset;
}
-
+
}
/* Activity Count 8 octets */
char *buf;
int bufpos;
struct pktcobj *pobject;
-
+
if (sfd < 0) {
return -1;
}
pobject = pobject->next;
}
}
-
+
errno = 0;
#ifdef HAVE_MSG_NOSIGNAL
#define SENDFLAGS MSG_NOSIGNAL | MSG_DONTWAIT
ast_debug(3, "------- gate modify gateid 0x%x ssip: 0x%x\n", gate->gateid, ssip);
/* TODO implement it */
ast_log(LOG_WARNING, "Modify GateID not implemented\n");
- }
-
+ }
+
if ((gate = cops_gate_cmd(cmd, NULL, cops_trid++, mta, actcount, bitrate, psize, ssip, ssport, gate))) {
ast_debug(3, "COPS: Allocating gate for mta: 0x%x\n", mta);
gate->got_dq_gi = got_dq_gi;
gate->gate_remove = gate_remove;
return(gate);
} else {
- ast_debug(3, "COPS: Couldn't allocate gate for mta: 0x%x\n", mta);
+ ast_debug(3, "COPS: Couldn't allocate gate for mta: 0x%x\n", mta);
return NULL;
}
}
gate->trid = trid;
}
}
-
+
gate->in_transaction = time(NULL);
if (!(gateset = malloc(sizeof(struct copsmsg)))) {
gateset->verflag = 0x10;
gateset->opcode = 2; /* Decision */
gateset->clienttype = 0x8008; /* =PacketCable */
-
+
/* Handle object */
gateset->object = malloc(sizeof(struct pktcobj));
if (!gateset->object) {
return NULL;
}
gateset->object->next->next->next->next = NULL;
-
+
gateset->length = COPS_HEADER_SIZE + gateset->object->length + gateset->object->next->length + gateset->object->next->next->length + gateset->object->next->next->next->length;
if ((cmd == GATE_INFO || cmd == GATE_SET_HAVE_GATEID || cmd == GATE_DEL) && gate) {
memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC;
+ hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = 0;
hints.ai_protocol = 0;
ast_debug(3, " S-Num S-type: 0x%.4x len: %i\n", (unsigned)snst, sobjlen);
if (snst == 0x0101 ) {
recvtrid = ntohs(*((uint16_t *) (sobjp + 4)));
- scommand = ntohs(*((uint16_t *) (sobjp + 6)));
+ scommand = ntohs(*((uint16_t *) (sobjp + 6)));
ast_debug(3, " Transaction Identifier command: %i trid %i\n", scommand, recvtrid);
} else if (snst == 0x0201) {
subscrid = ntohl(*((uint32_t *) (sobjp + 4)));
gate->gate_open = NULL;
}
break;
- }
+ }
}
}
AST_LIST_TRAVERSE_SAFE_END;
cmts->state = 2;
cmts->katimer = time(NULL);
}
- }
+ }
if (len <= 0) {
ast_debug(3, "COPS: lost connection to %s\n", cmts->name);
close(cmts->sfd);
cops_freemsg(recmsg);
}
}
- AST_LIST_UNLOCK(&cmts_list);
+ AST_LIST_UNLOCK(&cmts_list);
}
if (pktcreload) {
ast_debug(3, "Reloading pktccops...\n");
} else {
ast_log(LOG_WARNING, "Unkown option %s in general section of res_ptkccops.conf\n", v->name);
}
- }
+ }
} else {
/* Defaults */
host = NULL;
for (v = ast_variable_browse(config, cat); v; v = v->next) {
if (!strcasecmp(v->name, "host")) {
- host = v->value;
+ host = v->value;
} else if (!strcasecmp(v->name, "port")) {
port = v->value;
} else if (!strcasecmp(v->name, "t1")) {
struct cops_cmts *cmts;
char statedesc[16];
int katimer;
-
+
switch(cmd) {
case CLI_INIT:
e->command = "pktccops show cmtses";
- e->usage =
+ e->usage =
"Usage: pktccops show cmtses\n"
" List PacketCable COPS CMTSes.\n";
switch(cmd) {
case CLI_INIT:
e->command = "pktccops show gates";
- e->usage =
+ e->usage =
"Usage: pktccops show gates\n"
" List PacketCable COPS GATEs.\n";
} else {
ast_copy_string(state_desc, "N/A", sizeof(state_desc));
}
-
- ast_cli(a->fd, "%-16s 0x%.8x 0x%08x %-10s %10i %10i %u\n", (gate->cmts) ? gate->cmts->name : "null" , gate->gateid, gate->mta,
+
+ ast_cli(a->fd, "%-16s 0x%.8x 0x%08x %-10s %10i %10i %u\n", (gate->cmts) ? gate->cmts->name : "null" , gate->gateid, gate->mta,
state_desc, (int) (time(NULL) - gate->allocated), (gate->checked) ? (int) (time(NULL) - gate->checked) : 0, (unsigned int) gate->in_transaction);
}
AST_LIST_UNLOCK(&cmts_list);
switch(cmd) {
case CLI_INIT:
e->command = "pktccops show pools";
- e->usage =
+ e->usage =
"Usage: pktccops show pools\n"
" List PacketCable COPS ip pools of MTAs.\n";
switch (cmd) {
case CLI_INIT:
e->command = "pktccops gatedel";
- e->usage =
+ e->usage =
"Usage: pktccops gatedel <cmts> <gateid>\n"
" Send Gate-Del to cmts.\n";
return NULL;
}
}
AST_LIST_UNLOCK(&cmts_list);
-
+
if (!found)
return CLI_SHOWUSAGE;
trid = cops_trid++;
if (!sscanf(a->argv[3], "%x", &gateid)) {
- ast_cli(a->fd, "bad gate specification (%s)\n", a->argv[3]);
+ ast_cli(a->fd, "bad gate specification (%s)\n", a->argv[3]);
return CLI_SHOWUSAGE;
}
break;
}
}
-
+
if (!found) {
ast_cli(a->fd, "gate not found: %s\n", a->argv[3]);
return CLI_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "pktccops gateset";
- e->usage =
+ e->usage =
"Usage: pktccops gateset <cmts> <mta> <acctcount> <bitrate> <packet size> <switch ip> <switch port>\n"
" Send Gate-Set to cmts.\n";
return NULL;
switch (cmd) {
case CLI_INIT:
e->command = "pktccops set debug {on|off}";
- e->usage =
+ e->usage =
"Usage: pktccops set debug {on|off}\n"
" Turn on/off debuging\n";
return NULL;
.unload = unload_module,
.reload = reload_module,
);
-
*
* \author Anthony Minessale <anthmct@yahoo.com>
* \author Mark Spencer <markster@digium.com>
- *
+ *
* \ingroup applications
*/
#include "asterisk/cli.h"
-static char *cli_realtime_load(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
+static char *cli_realtime_load(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
#define CRL_HEADER_FORMAT "%30s %-30s\n"
struct ast_variable *var = NULL, *orig_var = NULL;
}
- if (a->argc < 5)
+ if (a->argc < 5)
return CLI_SHOWUSAGE;
var = ast_load_realtime_all(a->argv[2], a->argv[3], a->argv[4], SENTINEL);
return NULL;
}
- if (a->argc < 7)
+ if (a->argc < 7)
return CLI_SHOWUSAGE;
res = ast_update_realtime(a->argv[2], a->argv[3], a->argv[4], a->argv[5], a->argv[6], SENTINEL);
return NULL;
}
- if (a->argc < 7)
+ if (a->argc < 7)
return CLI_SHOWUSAGE;
if (a->argc == 7) {
unsigned int ssrc;
/*! Sequence number, used when creating/sending the RTP packet */
uint16_t seqno;
- unsigned int lastts;
+ unsigned int lastts;
struct timeval txcore;
struct ast_smoother *smoother;
};
ast_module_unref(ast_module_info->self);
}
-/*!
+/*!
* \internal
* \brief Push an SMDI message to the back of an interface's message queue.
* \param iface a pointer to the interface to use.
switch (type) {
case SMDI_MWI:
return ast_mutex_lock(&iface->mwi_q_lock);
- case SMDI_MD:
+ case SMDI_MD:
return ast_mutex_lock(&iface->md_q_lock);
}
-
+
return -1;
}
struct timeval now = ast_tvnow();
long elapsed = 0;
void *msg;
-
+
lock_msg_q(iface, type);
msg = unlink_from_msg_q(iface, type);
unlock_msg_q(iface, type);
ao2_ref(msg, -1);
ast_log(LOG_NOTICE, "Purged expired message from %s SMDI %s message queue. "
"Message was %ld milliseconds too old.\n",
- iface->name, (type == SMDI_MD) ? "MD" : "MWI",
+ iface->name, (type == SMDI_MD) ? "MD" : "MWI",
elapsed - iface->msg_expiry);
lock_msg_q(iface, type);
return msg;
}
-static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
+static void *smdi_message_wait(struct ast_smdi_interface *iface, int timeout,
enum smdi_message_type type, const char *search_key, struct ast_flags options)
{
struct timeval start;
return iface;
}
-/*!
+/*!
* \internal
* \brief Read an SMDI message.
*
tcflag_t paritybit = PARENB; /* even parity checking */
tcflag_t charsize = CS7; /* seven bit characters */
int stopbits = 0; /* One stop bit */
-
+
int msdstrip = 0; /* strip zero digits */
long msg_expiry = SMDI_MSG_EXPIRY_TIME;
continue;
}
}
-
+
if (!(iface = alloc_smdi_interface()))
continue;
ast_log(LOG_ERROR, "Error setting baud rate on %s (%s)\n", iface->name, strerror(errno));
continue;
}
-
+
/* set the stop bits */
if (stopbits)
iface->mode.c_cflag = iface->mode.c_cflag | CSTOPB; /* set two stop bits */
else
iface->mode.c_cflag = iface->mode.c_cflag & ~CSTOPB; /* set one stop bit */
-
+
/* set the parity */
iface->mode.c_cflag = (iface->mode.c_cflag & ~PARENB & ~PARODD) | paritybit;
-
+
/* set the character size */
iface->mode.c_cflag = (iface->mode.c_cflag & ~CSIZE) | charsize;
-
+
/* commit the desired attributes */
if (tcsetattr(iface->fd, TCSAFLUSH, &iface->mode)) {
ast_log(LOG_ERROR, "Error setting attributes on %s (%s)\n", iface->name, strerror(errno));
if (ao2_container_count(new_ifaces)) {
res = 1;
}
-
+
return res;
}
ast_channel_lock(chan);
datastore = ast_channel_datastore_find(chan, &smdi_msg_datastore_info, args.id);
ast_channel_unlock(chan);
-
+
if (!datastore) {
ast_log(LOG_WARNING, "No SMDI message found for message ID '%s'\n", args.id);
goto return_error;
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
* Module loading including tests for configuration or dependencies.
* This function can return AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_DECLINE,
* or AST_MODULE_LOAD_SUCCESS. If a dependency or environment variable fails
- * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
- * configuration file or other non-critical problem return
+ * tests return AST_MODULE_LOAD_FAILURE. If the module can not load the
+ * configuration file or other non-critical problem return
* AST_MODULE_LOAD_DECLINE. On success return AST_MODULE_LOAD_SUCCESS.
*/
static int load_module(void)
return (ast_store_realtime_fields(config->family, fields) <= 0) ? -1 : 0;
}
-/*! \brief Internal helper function which returns a filtered objectset.
+/*! \brief Internal helper function which returns a filtered objectset.
*
* The following are filtered out of the objectset:
* \li The id field. This is returned to the caller in an out parameter.
ast_free(srtp);
return NULL;
}
-
+
srtp->warned = 1;
return srtp;
if ((*len + SRTP_MAX_TRAILER_LEN) > sizeof(srtp->buf)) {
return -1;
}
-
+
localbuf = rtcp ? srtp->rtcpbuf : srtp->buf;
memcpy(localbuf, *buf, *len);
* at the top of the source tree.
*/
-/*!
+/*!
* \file
* \author Russell Bryant <russell@digium.com>
*
- * \brief DAHDI timing interface
+ * \brief DAHDI timing interface
*/
/*** MODULEINFO
return AST_TIMING_EVENT_CONTINUOUS;
case DAHDI_EVENT_TIMER_EXPIRED:
default:
- return AST_TIMING_EVENT_EXPIRED;
+ return AST_TIMING_EVENT_EXPIRED;
}
}
{
int fd;
int x = 160;
-
+
fd = open("/dev/dahdi/timer", O_RDWR);
if (fd < 0) {
flags |= O_NONBLOCK;
fcntl(timer->pipe[i], F_SETFL, flags);
}
-
+
ao2_lock(pthread_timers);
if (!ao2_container_count(pthread_timers)) {
ast_mutex_lock(&timing_thread.lock);
ast_variables_destroy(channel_types);
if (next == NULL || tech == NULL)
return NULL;
-
+
switch (vp->magic) {
case ASTCHANTYPEINDEX:
long_ret = name[*length - 1];
stasis_app_unregister_event_source(&bridge_event_source);
stasis_app_unregister_event_source(&channel_event_source);
}
-
-
/*! @} */
/*!
- * \brief Function type for validator functions. Allows for
+ * \brief Function type for validator functions. Allows for
*/
typedef int (*ari_validator)(struct ast_json *json);
{{#apis}}
# Completed, Expired or Failed.
#
#Archive: yes
-
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for sound files
#
# Copyright (C) 2006, Digium, Inc.
<!--
Asterisk -- An open source telephony toolkit.
-
+
Copyright (C) 1999 - 2012, Digium, Inc.
-
+
Mark Spencer <markster@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;
var selectedchan = null;
var hungupchan = "";
var transferedchan = "";
-
+
var demo = new Object;
-
+
function loggedOn() {
if (loggedon == 1)
return;
astmanEngine.pollEvents();
astmanEngine.sendRequest('action=status', demo.channels);
}
-
+
function clearChannelList() {
$('channellist').innerHTML = "<i class='light'>Not connected</i>";
}
astmanEngine.channelClear();
clearChannelList();
}
-
+
function updateButtons()
{
if ($(selectedchan)) {
$('refresh').disabled = 1;
}
}
-
+
demo.channelCallback = function(target) {
selectedchan = target;
updateButtons();
}
-
+
demo.channels = function(msgs) {
resp = msgs[0].headers['response'];
if (resp == "Success") {
} else
loggedOff();
- for (i=1;i<msgs.length - 1;i++)
+ for (i=1;i<msgs.length - 1;i++)
astmanEngine.channelUpdate(msgs[i]);
$('channellist').innerHTML = astmanEngine.channelTable(demo.channelCallback);
$('statusbar').innerHTML = "Ready";
else
loggedOff();
};
-
-
+
+
demo.logoffs = function(msgs) {
$('statusbar').innerHTML = msgs[0].headers['message'];
loggedOff();
demo.hungup = function(msgs) {
$('statusbar').innerHTML = "Hungup " + hungupchan;
}
-
+
demo.transferred = function(msgs) {
$('statusbar').innerHTML = "Transferred " + transferredchan;
}
$('statusbar').innerHTML = "<i>Updating channel status...</i>";
astmanEngine.channelClear();
astmanEngine.sendRequest('action=status', demo.channels);
- }
-
+ }
+
function doLogin() {
$('statusbar').innerHTML = "<i>Logging in...</i>";
astmanEngine.sendRequest('action=login&username=' + $('username').value + "&secret=" + $('secret').value, demo.logins);
}
-
+
function doTransfer() {
var channel = astmanEngine.channelInfo(selectedchan);
var exten = prompt("Enter new extension for " + selectedchan);
}
}
}
-
+
function doLogoff() {
$('statusbar').innerHTML = "<i>Logging off...</i>";
astmanEngine.sendRequest('action=logoff', demo.logoffs);
}
-
+
demo.pongs = function(msgs) {
resp = msgs[0].headers['response'];
if (resp == "Pong") {
loggedOff();
}
}
-
+
demo.eventcb = function(msgs) {
var x;
if (loggedon) {
}
updateButtons();
}
-
+
function localajaminit() {
astmanEngine.setURL('../rawman');
astmanEngine.setEventCallback(demo.eventcb);
.chanlistodd {
background-color : #f0f5ff;
-}
+}
.chanlistselected {
background-color : #ffb13d;
};
this.clickChannel = function(ev) {
var target = ev.target;
- // XXX This is icky, we statically use astmanEngine to call the callback XXX
+ // XXX This is icky, we statically use astmanEngine to call the callback XXX
if (me.selecttarget)
me.restoreTarget(me.selecttarget);
while(!target.id || !target.id.length)
other = target.nextSibling.nextSibling.className;
}
if (other) {
- if (other == "chanlisteven")
+ if (other == "chanlisteven")
target.className = "chanlistodd";
else
target.className = "chanlisteven";
if (!channels[channame])
channels[channame] = new Array();
-
+
if (msg.headers.event) {
if (msg.headers.event == "Hangup") {
delete channels[channame];
var x,y;
var s = t.responseText;
var allheaders = s.split('\r\n');
- if (me.debug)
+ if (me.debug)
me.debug.value = "\n";
for (x=0;x<allheaders.length;x++) {
if (allheaders[x].length) {
<!--
Asterisk -- An open source telephony toolkit.
-
+
Copyright (C) 1999 - 2012, Digium, Inc.
-
+
Mark Spencer <markster@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;
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Makefile for test modules
#
# Copyright (C) 2008, Digium, Inc.
#define TACL_A AST_SENSE_ALLOW
#define TACL_D AST_SENSE_DENY
-static int build_ha(const struct acl *acl, size_t len, struct ast_ha **ha, const char *acl_name, int *err, struct ast_test *test, enum ast_test_result_state *res)
+static int build_ha(const struct acl *acl, size_t len, struct ast_ha **ha, const char *acl_name, int *err, struct ast_test *test, enum ast_test_result_state *res)
{
size_t i;
# Session Limit
printf "Action: Login\r\nUsername: russell\r\nSecret: blah123\r\n\r\n" | nc -w 5 localhost 5038 &
printf "Action: Login\r\nUsername: russell\r\nSecret: blah123\r\n\r\n" | nc -w 1 localhost 5038
-
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Config test module");
-
* \brief Doubly-Linked List Tests
*
* \author\verbatim Steve Murphy <murf@digium.com> \endverbatim
- *
+ *
* This module will run some DLL tests at load time
* \ingroup tests
*/
if (t1 != AST_DLLIST_LAST(&x->entries))
strcat(buff," <=> ");
}
-
+
ast_debug(1,"Got: %s [expect %s]\n", buff, expect);
}
if (t1 != AST_DLLIST_FIRST(&x->entries))
strcat(buff," <=> ");
}
-
+
ast_debug(1,"Got: %s [expect %s]\n", buff, expect);
}
/* Macros to test:
AST_DLLIST_LOCK(head)
AST_RWDLLIST_WRLOCK(head)
-AST_RWDLLIST_WRLOCK(head)
+AST_RWDLLIST_WRLOCK(head)
AST_RWDLLIST_RDLOCK(head)
AST_DLLIST_TRYLOCK(head)
AST_RWDLLIST_TRYWRLOCK(head)
AST_DLLIST_TRAVERSE_SAFE_END
AST_DLLIST_REMOVE_CURRENT(field)
AST_DLLIST_MOVE_CURRENT(newhead, field)
-AST_DLLIST_INSERT_BEFORE_CURRENT(elm, field)
+AST_DLLIST_INSERT_BEFORE_CURRENT(elm, field)
AST_DLLIST_MOVE_CURRENT_BACKWARDS(newhead, field)
struct test1 *c;
struct test1 *d;
struct test1 *e;
-
+
ast_debug(1,"Test AST_DLLIST_INSERT_HEAD, AST_DLLIST_TRAVERSE, AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_BEGIN, AST_DLLIST_TRAVERSE_BACKWARDS_SAFE_END\n");
tc = make_cont();
a = make_test1("A");
print_list(tc, "A <=> B <=> C <=> D");
destroy_test_container(tc);
-
+
tc = make_cont();
if (AST_DLLIST_EMPTY(&tc->entries))
b = make_test1("B");
c = make_test1("C");
d = make_test1("D");
-
+
ast_debug(1,"Test AST_DLLIST_INSERT_TAIL\n");
AST_DLLIST_INSERT_TAIL(&tc->entries, a, list);
AST_DLLIST_INSERT_TAIL(&tc->entries, b, list);
AST_DLLIST_REMOVE(&tc->entries, d, list);
print_list(tc, "B");
AST_DLLIST_REMOVE(&tc->entries, b, list);
-
+
if (AST_DLLIST_EMPTY(&tc->entries))
ast_debug(1,"Test AST_DLLIST_REMOVE....OK\n");
else
ast_debug(1,"Test AST_DLLIST_REMOVE_CURRENT... OK\n");
else
ast_log(LOG_ERROR,"Test AST_DLLIST_REMOVE_CURRENT... PROBLEM\n");
-
+
ast_debug(1,"Test AST_DLLIST_MOVE_CURRENT, AST_DLLIST_INSERT_BEFORE_CURRENT\n");
AST_DLLIST_INSERT_HEAD(&tc->entries, a, list);
AST_DLLIST_INSERT_AFTER(&tc->entries, a, b, list);
if (e == a) {
AST_DLLIST_INSERT_BEFORE_CURRENT(d, list); /* D A B C */
}
-
+
if (e == b) {
AST_DLLIST_MOVE_CURRENT(&tc->entries, list); /* D A C B */
}
-
+
}
AST_DLLIST_TRAVERSE_SAFE_END;
print_list(tc, "D <=> A <=> C <=> B");
-
+
destroy_test_container(tc);
tc = make_cont();
AST_DLLIST_INSERT_BEFORE_CURRENT_BACKWARDS(d, list); /* C A D */
print_list(tc, "C <=> A <=> D");
}
-
+
}
AST_DLLIST_TRAVERSE_SAFE_END;
print_list(tc, "C <=> A <=> D");
* \brief Locale Test
*
* \author\verbatim Tilghman Lesher <tlesher AT digium DOT com> \endverbatim
- *
+ *
* \ingroup tests
*/
* at the top of the source tree.
*/
-/*!
+/*!
* \file
* \brief Skeleton Test
*
* \author\verbatim <Your Name Here> <<Your Email Here>> \endverbatim
- *
+ *
* This is a skeleton for development of an Asterisk test module
* \ingroup tests
*/
* \brief Substitution Test
*
* \author\verbatim Tilghman Lesher <tlesher AT digium DOT com> \endverbatim
- *
+ *
* \ingroup tests
*/
$(TP_SUBDIRS):
+$(CMD_PREFIX) $(SUBMAKE) -C $@ $(MAKECMDGOALS)
-
[
PJPROJECT_CONFIGURE()
])
-
{
return vasprintf(strp, format, ap);
}
-
-
#
# Asterisk -- An open source telephony toolkit.
-#
+#
# Various utilities
#
# Copyright (C) 1999-2006, Digium
# the 1.2 days. The neat part is that it will actually evaluate the expressions.
# Users could use this to quickly check expressions in their .ael file.
# to get check_expr2, add it to the ALL_UTILS list -- this is a program that will
-# read in a file containing expressions (as if they were in $[ ]), one per line.
+# read in a file containing expressions (as if they were in $[ ]), one per line.
# It will, of course signal any syntax errors. Devs (like murf) should use this whenever
# changes are made to ast_expr2.y or ast_expr2.fl (or the corresponding .c files),
# as a regression test. Others (mere mortals?) need not bother, but they are
if [ "$$x" != "none" ]; then \
$(INSTALL) -m 755 $$x "$(DESTDIR)$(ASTSBINDIR)/$$x"; \
fi; \
- done
+ done
uninstall:
for x in $(ALL_UTILS); do rm -f "$(DESTDIR)$(ASTSBINDIR)/$$x"; done
$(ECHO_PREFIX) echo " [LD] ast_expr2fz.o ast_expr2z.o -> check_expr2"
$(CC) -g -o check_expr2 ast_expr2fz.o ast_expr2z.o -lm
$(ECHO_PREFIX) echo " [RM] ast_expr2fz.o ast_expr2z.o"
- rm ast_expr2z.o ast_expr2fz.o
+ rm ast_expr2z.o ast_expr2fz.o
./check_expr2 expr2.testinput
smsq: smsq.o strcompat.o
struct namelist *next;
};
-struct ast_context
+struct ast_context
{
int extension_count;
char name[100];
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action);
struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action)
{
return localized_find_extension(bypass, q, context, exten, priority, label, callerid, action);
void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count)
{
if (cp1 && *cp1)
- strncpy(cp2,cp1,AST_MAX_EXTENSION); /* Right now, this routine is ONLY being called for
+ strncpy(cp2,cp1,AST_MAX_EXTENSION); /* Right now, this routine is ONLY being called for
a possible var substitution on extension names,
so....! */
else
if( FIRST_TIME ) {
FIRST_TIME = 0;
-
+
if( globalvars )
fprintf(dumpfile,"[globals]\n");
-
+
for(n=globalvars;n;n=n->next) {
fprintf(dumpfile, "%s\n", n->name);
}
}
-
+
/* print out each extension , possibly the context header also */
if( con != last_context ) {
fprintf(dumpfile,"\n\n[%s]\n", con->name);
for(n=con->eswitches;n;n=n->next) {
fprintf(dumpfile, "eswitch => %s/%s\n", n->name, n->name2);
}
-
+
}
if( data ) {
filter_newlines((char*)data);
fprintf(dumpfile,"exten => %s,%d,%s\n", extension, priority, application);
}
}
-
+
/* since add_extension2 is responsible for the malloc'd data stuff */
free(data);
return 0;
ADD_LAST(globalvars,x);
}
}
-
+
struct ast_context * ast_context_create(void **extcontexts, const char *name, const char *registrar)
{
{
/* Mainly for aesthetics */
char *t, *v, *u = str;
-
+
while ( u && *u ) {
if( *u == '$' && *(u+1) == '[' ) {
}
}
}
-
+
u++;
}
}
int i;
struct namelist *n;
struct ast_context *lp,*lp2;
-
+
for(i=1;i<argc;i++) {
if( argv[i][0] == '-' && argv[i][1] == 'n' )
no_comp =1;
if( argv[i][0] == '-' && argv[i][1] == 'w' )
dump_extensions =1;
}
-
+
if( !quiet ) {
printf("\n(If you find progress and other non-error messages irritating, you can use -q to suppress them)\n");
if( !no_comp )
localized_use_conf_dir();
}
strcpy(var_dir, "/var/lib/asterisk");
-
+
if( dump_extensions ) {
dumpfile = fopen("extensions.conf.aeldump","w");
if( !dumpfile ) {
printf("\n\nSorry, cannot open extensions.conf.aeldump for writing! Correct the situation and try again!\n\n");
exit(10);
}
-
+
}
FIRST_TIME = 1;
-
+
ael_external_load_module();
-
+
ast_log(4, "ael2_parse", __LINE__, "main", "%d contexts, %d extensions, %d priorities\n", conts, extens, priors);
if( dump_extensions && dumpfile ) {
-
+
for( lp = context_list; lp; lp = lp->next ) { /* print out any contexts that didn't have any
extensions in them */
if( lp->extension_count == 0 ) {
-
+
fprintf(dumpfile,"\n\n[%s]\n", lp->name);
-
+
for(n=lp->ignorepats;n;n=n->next) {
fprintf(dumpfile, "ignorepat => %s\n", n->name);
}
}
}
}
-
+
if( dump_extensions && dumpfile )
fclose(dumpfile);
-
+
for( lp = context_list; lp; lp = lp2 ) { /* free the ast_context structs */
lp2 = lp->next;
lp->next = 0;
free(lp);
}
-
+
return 0;
}
/* Exit when the parent dies */
return 0;
}
-
.ds f2\"
.ds f3\"
.ds f4\"
-'\" t
-.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n
+'\" t
+.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n
.TH ASTMAN 1 "Jun 12th, 2005" "astman" "Linux Programmer's Manual"
.SH NAME
.B astman
-- a client to asterisk's manager interface
.SH SYNOPSIS
-.PP
+.PP
.B astman
.I hostname
.SH OPTIONS
.B hostname
-The host name or IP address to connect to (TCP port 5038). If astman
+The host name or IP address to connect to (TCP port 5038). If astman
fails to connect it will exit immidiately.
.SH USAGE
-If \fBastman\fR has successfully cunnected to the manager port it will
-prompt the user for a username and a secret (password) for the manager
-interface on the remote Asterisk manager interface. It will then be able
-to report existing channels (calls). You will then be able to redirect
+If \fBastman\fR has successfully cunnected to the manager port it will
+prompt the user for a username and a secret (password) for the manager
+interface on the remote Asterisk manager interface. It will then be able
+to report existing channels (calls). You will then be able to redirect
calls to or terminate them.
-.SH "SEE ALSO"
+.SH "SEE ALSO"
asterisk(8)
http://www.voip-info.org/wiki-Asterisk+astman
.SH BUGS
-The hostname does not default to localhost.
+The hostname does not default to localhost.
Impossible to use a port other than 5038.
I mean, what's the point in a man page if the syntax is so simple?
-.SH "AUTHOR"
-This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU General Public License, Version 2 any
-later version published by the Free Software Foundation.
+.SH "AUTHOR"
+This manual page was written by Tzafrir Cohen <tzafrir.cohen@xorcom.com>
+Permission is granted to copy, distribute and/or modify this document under
+the terms of the GNU General Public License, Version 2 any
+later version published by the Free Software Foundation.
-On Debian systems, the complete text of the GNU General Public
-License can be found in /usr/share/common-licenses/GPL.
+On Debian systems, the complete text of the GNU General Public
+License can be found in /usr/share/common-licenses/GPL.
/*
* 2005.05.27 - different versions of newt define the type of the buffer
- * for the 5th argument to newtEntry() as char ** or const char ** . To
- * let the code compile cleanly with -Werror, we cast it to void * through
+ * for the 5th argument to newtEntry() as char ** or const char ** . To
+ * let the code compile cleanly with -Werror, we cast it to void * through
* _NEWT_CAST.
*/
#define _NEWT_CAST (void *)
for (x=0;x<m->hdrcount;x++) {
printf("Header: %s\n", m->headers[x]);
}
-#endif
+#endif
return 0;
}
newtListboxClear(c);
AST_LIST_TRAVERSE(&chans, chan, list) {
snprintf(tmpn, sizeof(tmpn), "%s (%s)", chan->name, chan->callerid);
- if (strlen(chan->exten))
- snprintf(tmp, sizeof(tmp), "%-30s %8s -> %s@%s:%s",
+ if (strlen(chan->exten))
+ snprintf(tmp, sizeof(tmp), "%-30s %8s -> %s@%s:%s",
tmpn, chan->state,
chan->exten, chan->context, chan->priority);
else
static int has_input(struct ast_mansession *s)
{
int x;
- for (x=1;x<s->inlen;x++)
- if ((s->inbuf[x] == '\n') && (s->inbuf[x-1] == '\r'))
+ for (x=1;x<s->inlen;x++)
+ if ((s->inbuf[x] == '\n') && (s->inbuf[x-1] == '\r'))
return 1;
return 0;
}
s->inlen -= (x + 1);
return 1;
}
- }
+ }
if (s->inlen >= sizeof(s->inbuf) - 1) {
fprintf(stderr, "Dumping long line with no return from %s: %s\n", inet_ntoa(s->sin.sin_addr), s->inbuf);
s->inlen = 0;
show_message("Status Failed Failed", get_header(m, "Message"));
}
}
-
+
static void try_hangup(newtComponent c)
{
show_message("Hangup Failed", get_header(m, "Message"));
}
}
-
+
}
static int get_user_input(char *msg, char *buf, int buflen)
newtFormAddComponents(form, inpfield, ok, cancel, NULL);
newtFormRun(form, &es);
strncpy(buf, input, buflen - 1);
- if (es.u.co == ok)
+ if (es.u.co == ok)
res = 0;
else
res = -1;
if (chan) {
strncpy(channame, chan->name, sizeof(channame) - 1);
snprintf(tmp, sizeof(tmp), "Enter new extension for %s", channame);
- if (get_user_input(tmp, dest, sizeof(dest)))
+ if (get_user_input(tmp, dest, sizeof(dest)))
return;
if ((context = strchr(dest, '@'))) {
*context = '\0';
show_message("Hangup Failed", get_header(m, "Message"));
}
}
-
+
}
static int manage_calls(char *host)
/* Mark: If there's one thing you learn from this code, it is this...
Never, ever fly Air France. Their customer service is absolutely
- the worst. I've never heard the words "That's not my problem" as
+ the worst. I've never heard the words "That's not my problem" as
many times as I have from their staff -- It should, without doubt
- be their corporate motto if it isn't already. Don't bother giving
+ be their corporate motto if it isn't already. Don't bother giving
them business because you're just a pain in their side and they
will be sure to let you know the first time you speak to them.
-
+
If you ever want to make me happy just tell me that you, too, will
never fly Air France again either (in spite of their excellent
- cuisine).
-
+ cuisine).
+
Update by oej: The merger with KLM has transferred this
- behaviour to KLM as well.
+ behaviour to KLM as well.
Don't bother giving them business either...
Only if you want to travel randomly without luggage, you
might pick either of them.
-
+
*/
snprintf(tmp, sizeof(tmp), "Asterisk Manager at %s", host);
newtCenteredWindow(74, 20, tmp);
channels = newtListbox(1,1,14, NEWT_FLAG_SCROLL);
newtFormAddComponents(form, channels, redirect, hangup, quit, NULL);
newtListboxSetWidth(channels, 72);
-
+
show_doing("Getting Status", "Retrieving system status...");
try_status();
hide_doing();
char tmp[55];
struct hostent *hp;
int res = -1;
-
+
session.fd = socket(AF_INET, SOCK_STREAM, 0);
if (session.fd < 0) {
snprintf(tmp, sizeof(tmp), "socket() failed: %s\n", strerror(errno));
show_message("Socket failed", tmp);
return -1;
}
-
+
snprintf(tmp, sizeof(tmp), "Looking up %s\n", hostname);
show_doing("Connecting....", tmp);
-
-
+
+
hp = gethostbyname(hostname);
if (!hp) {
snprintf(tmp, sizeof(tmp), "No such address: %s\n", hostname);
show_message("Connect Failed", tmp);
return -1;
}
-
+
hide_doing();
-
+
login = newtButton(5, 6, "Login");
cancel = newtButton(25, 6, "Cancel");
newtCenteredWindow(40, 10, "Asterisk Manager Login");
snprintf(tmp, sizeof(tmp), "Host: %s", hostname);
label = newtLabel(4,1, tmp);
-
+
ulabel = newtLabel(4,2,"Username:");
plabel = newtLabel(4,3,"Password:");
-
+
username = newtEntry(14, 2, "", 20, _NEWT_CAST &user, 0);
password = newtEntry(14, 3, "", 20, _NEWT_CAST &pass, NEWT_FLAG_HIDDEN);
-
+
form = newtForm(NULL, NULL, 0);
newtFormAddComponents(form, username, password, login, cancel, label, ulabel, plabel,NULL);
newtFormRun(form, &es);
show_message("Login Failed", get_header(m, "Message"));
}
} else {
- manager_action("Login",
+ manager_action("Login",
"Username: %s\r\n"
"Secret: %s\r\n",
user, pass);
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
int check_eval(char *buffer, char *error_report);
void parse_file(const char *fname);
-void ast_register_file_version(const char *file, const char *version);
+void ast_register_file_version(const char *file, const char *version);
void ast_register_file_version(const char *file, const char *version) { }
#if !defined(LOW_MEMORY)
-int ast_add_profile(const char *x, uint64_t scale) { return 0;}
+int ast_add_profile(const char *x, uint64_t scale) { return 0;}
#endif
int ast_atomic_fetchadd_int_slow(volatile int *p, int v)
{
unsigned int warn_found = 0;
error_report[0] = 0;
-
+
for (cp = buffer; *cp; ++cp)
{
switch (*cp)
global_lineno);
}
break;
-
+
case '>':
case '<':
case '!':
++warn_found;
}
break;
-
+
case '|':
case '&':
case '=':
if (*cp == '$' && *(cp+1) == '{') {
int brack_lev = 1;
char *xp= cp+2;
-
+
while (*xp) {
if (*xp == '{')
brack_lev++;
else if (*xp == '}')
brack_lev--;
-
+
if (brack_lev == 0)
break;
xp++;
if (*xp == '}') {
char varname[200];
char *val;
-
+
strncpy(varname,cp+2, xp-cp-2);
varname[xp-cp-2] = 0;
cp = xp;
int c1;
char last_char= 0;
char buffer[30000]; /* I sure hope no expr gets this big! */
-
+
if (!f) {
fprintf(stderr,"Couldn't open %s for reading... need an extensions.conf file to parse!\n",fname);
exit(20);
fprintf(stderr,"Couldn't open 'expr2_log' file for writing... please fix and re-run!\n");
exit(21);
}
-
+
global_lineno = 1;
-
+
while ((c1 = fgetc(f)) != EOF) {
if (c1 == '\n')
global_lineno++;
int bufcount = 0;
int retval;
char error_report[30000];
-
+
while ((c1 = fgetc(f)) != EOF) {
if (c1 == '[')
bracklev++;
fclose(l);
printf("--- ERROR --- A newline in the middle of an expression at line %d!\n", global_lineno);
}
-
+
if (bracklev == 0)
break;
buffer[bufcount++] = c1;
printf("--- ERROR --- EOF reached in middle of an expression at line %d!\n", global_lineno);
exit(22);
}
-
+
buffer[bufcount] = 0;
/* update stats */
global_expr_tot_size += bufcount;
global_expr_count++;
if (bufcount > global_expr_max_size)
global_expr_max_size = bufcount;
-
+
retval = check_expr(buffer, error_report); /* check_expr should bump the warning counter */
if (retval != 0) {
/* print error report */
- printf("Warning(s) at line %d, expression: $[%s]; see expr2_log file for details\n",
+ printf("Warning(s) at line %d, expression: $[%s]; see expr2_log file for details\n",
global_lineno, buffer);
fprintf(l, "%s", error_report);
}
global_warn_count,
global_expr_max_size,
(global_expr_count) ? global_expr_tot_size/global_expr_count : 0);
-
+
fclose(f);
fclose(l);
}
{
int argc1;
char *eq;
-
+
if (argc < 2) {
printf("check_expr -- a program to look thru extensions.conf files for $[...] expressions,\n");
printf(" and run them thru the parser, looking for problems\n");
printf(" Note that messages about operators not being surrounded by spaces is merely to alert\n");
printf(" you to possible problems where you might be expecting those operators as part of a string.\n");
printf(" (to include operators in a string, wrap with double quotes!)\n");
-
+
exit(19);
}
global_varlist = 0;
}
/* parse command args for x=y and set varz */
-
+
parse_file(argv[1]);
return 0;
}
-/*
+/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2007, Digium, Inc.
char *config = "extensions.conf";
-/*
+/*
static char *registrar = "conf2ael";
static char userscontext[AST_MAX_EXTENSION] = "default";
static int static_config = 0;
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
/*! \brief Structure for dial plan hints
\note Hints are pointers from an extension in the dialplan to one or
- more devices (tech/name)
+ more devices (tech/name)
- See \ref AstExtState
*/
struct ast_hint {
{
int i;
int thisbit, thatbit = bit_at(word, bitsperword, totalbits-1);
-
+
for (i=0; i<totalbits; i++) {
thisbit = bit_at(word, bitsperword, i);
-
+
if (thisbit != thatbit ) {
if (thisbit) {
*start = i;
int all_bits_set(unsigned int *word, int bitsperword, int totalbits )
{
-
+
int i, total=totalbits/bitsperword,bitmask = 0;
-
+
for (i=0; i<bitsperword; i++)
{
bitmask |= (1 << i);
}
-
+
for (i=0; i<total; i++)
{
if (word[i] != bitmask)
if (strcmp(argv[i],"-d")==0)
localdir =1;
}
-
+
/* 3 simple steps: */
- /* 1. read in the extensions.conf config file
+ /* 1. read in the extensions.conf config file
* 2. traverse, and build an AEL tree
* 3. Output the AEL tree into a file
*/
if (!localdir)
localized_use_conf_dir();
localized_pbx_load_module();
-
+
printf("... Done!\n");
-
+
tmp = 0;
while ((tmp = localized_walk_contexts(tmp)) ) {
printf("Context: %s\n", tmp->name);
tree = tmptree;
else
pvalTopLevAddObject(tree, tmptree);
-
+
pvalContextSetName(tmptree, ast_strdup(tmp->name));
-
+
if (tmp->includes) {
incl = pvalCreateNode(PV_INCLUDES);
pvalContextAddStatement(tmptree, incl);
char domrange[10];
char monrange[10];
int startbit=0, endbit=0;
-
+
if (all_bits_set(tmpi->timing.minmask, 30, 720))
strcpy(timerange, "*");
else {
strcat(timerange,"-");
strcat(timerange,tbuf);
}
-
+
if (all_bits_set(&tmpi->timing.dowmask, 7, 7))
strcpy(dowrange, "*");
else {
strcat(dowrange,"-");
strcat(dowrange, days[endbit]);
}
-
+
if (all_bits_set(&tmpi->timing.monthmask, 12, 12))
strcpy(monrange, "*");
else {
strcat(monrange,"-");
strcat(monrange, months[endbit]);
}
-
+
if (all_bits_set(&tmpi->timing.daymask, 31, 31))
strcpy(domrange, "*");
else {
}
/* now all 4 fields are set; what do we do? */
pvalIncludesAddIncludeWithTimeConstraints(incl, strdup(tmpi->name), strdup(timerange), strdup(domrange), strdup(dowrange), strdup(monrange));
-
+
} else {
pvalIncludesAddInclude(incl, strdup(tmpi->name));
}
pval *exten = pvalCreateNode(PV_EXTENSION);
pvalContextAddStatement(tmptree, exten);
pvalExtenSetName(exten, ast_strdup(eroot->exten));
-
+
if (eroot->peer) {
pval *block = pvalCreateNode(PV_STATEMENTBLOCK);
pvalExtenSetStatement(exten, block);
-
+
e = 0;
while ( (e = localized_walk_extension_priorities(eroot, e)) ) {
-
+
pval *statemnt = pvalCreateNode(PV_APPLICATION_CALL);
pval *args = pvalCreateNode(PV_WORD);
-
+
/* printf(" %s(%s)\n", e->app, (char*)e->data); */
pvalAppCallSetAppName(statemnt, ast_strdup(e->app));
pvalWordSetString(args, ast_strdup(e->data));
pvalAppCallAddArg(statemnt, args);
-
+
pvalStatementBlockAddStatement(block, statemnt);
}
} else if (eroot->priority == -1) {
pval *statemnt = pvalCreateNode(PV_APPLICATION_CALL);
pval *args = pvalCreateNode(PV_WORD);
-
+
/* printf(" %s (%s)\n", eroot->app, (char *)eroot->data); */
-
+
pvalAppCallSetAppName(statemnt, ast_strdup(eroot->app));
pvalWordSetString(args, ast_strdup(eroot->data));
-
+
pvalAppCallAddArg(statemnt, args);
pvalExtenSetStatement(exten, statemnt);
}
if (AST_LIST_FIRST(&tmp->alts)) {
sws = pvalCreateNode(PV_SWITCHES);
pvalContextAddStatement(tmptree,sws);
-
+
sw = 0;
while ((sw = localized_walk_context_switches(tmp,sw)) ) {
pvalSwitchesAddSwitch(sws, ast_strdup(sw->name));
}
}
printf("Generating aelout.ael file...\n");
-
+
ael2_print("aelout.ael", tree);
-
+
printf("...Done!\n");
return 0;
}
void pbx_substitute_variables_helper(struct ast_channel *c,const char *cp1,char *cp2,int count)
{
if (cp1 && *cp1)
- strncpy(cp2,cp1,AST_MAX_EXTENSION); /* Right now, this routine is ONLY being called for
+ strncpy(cp2,cp1,AST_MAX_EXTENSION); /* Right now, this routine is ONLY being called for
a possible var substitution on extension names,
so....! */
else
int ast_context_add_ignorepat2(struct ast_context *con, const char *value, const char *registrar)
{
-
+
return localized_context_add_ignorepat2(con, value, registrar);
}
int ast_context_add_switch2(struct ast_context *con, const char *value,
const char *data, int eval, const char *registrar)
{
-
+
return localized_context_add_switch2(con, value, data, eval, registrar);
}
int ast_context_add_include2(struct ast_context *con, const char *value,
const char *registrar)
{
-
+
return localized_context_add_include2(con, value,registrar);
}
struct ast_context *ast_context_find_or_create(struct ast_context **extcontexts, struct ast_hashtab *exttable, const char *name, const char *registrar)
{
printf("find/Creating context %s, registrar=%s\n", name, registrar);
-
+
return localized_context_find_or_create(extcontexts, exttable, name, registrar);
}
struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action);
struct ast_exten *pbx_find_extension(struct ast_channel *chan,
struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action)
{
return localized_find_extension(bypass, q, context, exten, priority, label, callerid, action);
All test programs which need key/data pairs expect them entered
with key and data on separate lines
- tcreat3.c
- Takes
- bucketsize (bsize),
+ tcreat3.c
+ Takes
+ bucketsize (bsize),
fill factor (ffactor), and
- initial number of elements (nelem).
- Creates a hash table named hashtest containing the
+ initial number of elements (nelem).
+ Creates a hash table named hashtest containing the
keys/data pairs entered from standard in.
thash4.c
Takes
- bucketsize (bsize),
- fill factor (ffactor),
+ bucketsize (bsize),
+ fill factor (ffactor),
initial number of elements (nelem)
bytes of cache (ncached), and
file from which to read data (fname)
NOTES:
The file search.h is provided for using the hsearch compatible interface
-on BSD systems. On System V derived systems, search.h should appear in
+on BSD systems. On System V derived systems, search.h should appear in
/usr/include.
The man page ../man/db.3 explains the interface to the hashing system.
the db interface only creates a single database file. To avoid overwriting
the user's original file, the suffix ".db" is appended to the file name
passed to dbm_open. Additionally, if your code "knows" about the historic
-.dir and .pag files, it will break.
+.dir and .pag files, it will break.
There is a fundamental difference between this package and the old hsearch.
Hsearch requires the user to maintain the keys and data in the application's
in_use_bits = free_bit;
else
in_use_bits = (hashp->BSIZE << BYTE_SHIFT) - 1;
-
+
if (i == first_page) {
bit = hashp->LAST_FREED &
((hashp->BSIZE << BYTE_SHIFT) - 1);
int lorder; /* byte order */
size_t reclen; /* record length (fixed-length records) */
u_char bval; /* delimiting byte (variable-length records */
- char *bfname; /* btree file name */
+ char *bfname; /* btree file name */
} RECNOINFO;
#ifdef __DBINTERFACE_PRIVATE
}
BT_PUSH(t, pg, index - 1);
-
+
pg = r->pgno;
switch (op) {
case SDELETE:
einval: errno = EINVAL;
return (RET_ERROR);
}
-
+
if (t->bt_nrecs == 0 || nrec > t->bt_nrecs) {
if (!F_ISSET(t, R_EOF | R_INMEM) &&
(status = t->bt_irec(t, nrec)) != RET_SUCCESS)
-/*
+/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2006, Digium, Inc.
#endif
#define AST_API_MODULE 1 /* gimme the inline defs! */
-struct ast_channel
+struct ast_channel
{
char x; /* basically empty! */
};
static inline int __ast_pthread_mutex_init_attr(const char *filename, int lineno, const char *func,
const char *mutex_name, ast_mutex_t *t,
- pthread_mutexattr_t *attr)
+ pthread_mutexattr_t *attr)
{
#ifdef AST_MUTEX_INIT_W_CONSTRUCTORS
int canlog = strcmp(filename, "logger.c");
}
if ((res = pthread_mutex_unlock(&t->mutex))) {
- __ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n",
+ __ast_mutex_logger("%s line %d (%s): Error releasing mutex: %s\n",
filename, lineno, func, strerror(res));
DO_THREAD_CRASH;
}
ast_mutex_init(&mutex); \
}
#else /* !AST_MUTEX_INIT_W_CONSTRUCTORS */
-/* By default, use static initialization of mutexes. */
+/* By default, use static initialization of mutexes. */
#define __AST_MUTEX_DEFINE(scope, mutex) \
scope ast_mutex_t mutex = AST_MUTEX_INIT_VALUE
#endif /* AST_MUTEX_INIT_W_CONSTRUCTORS */
{
__asm __volatile (
" lock xaddl %0, %1 ; "
- : "+r" (v), /* 0 (result) */
+ : "+r" (v), /* 0 (result) */
"=m" (*p) /* 1 */
: "m" (*p)); /* 2 */
return (v);
* message in the case that the allocation fails.
*
* ast_strndup(), unlike strndup(), can safely accept a NULL argument for the
- * string to duplicate. If a NULL argument is provided, ast_strdup will return
+ * string to duplicate. If a NULL argument is provided, ast_strdup will return
* NULL without generating any kind of error log message.
*
* The arguments and return value are the same as strndup()
int siz = strlen(str);
if (rem < siz+1) {
lline_buffer = ast_realloc(lline_buffer, lline_buffer_size + CB_INCR + siz + 1);
- if (!lline_buffer)
+ if (!lline_buffer)
return;
lline_buffer_size += CB_INCR + siz + 1;
}
strcat(lline_buffer,str);
}
-static void CB_RESET(void )
-{
- comment_buffer[0] = 0;
+static void CB_RESET(void )
+{
+ comment_buffer[0] = 0;
lline_buffer[0] = 0;
}
-
+
/*! \brief Keep track of how many threads are currently trying to wait*() on
* a child process */
static unsigned int safe_system_level = 0;
pid = fork();
#else
pid = vfork();
-#endif
+#endif
if (pid == 0) {
#ifdef HAVE_WORKING_FORK
if (res > -1) {
res = WIFEXITED(status) ? WEXITSTATUS(status) : -1;
break;
- } else if (errno != EINTR)
+ } else if (errno != EINTR)
break;
}
} else {
}
static struct ast_comment *ALLOC_COMMENT(const char *buffer)
-{
+{
struct ast_comment *x = ast_calloc(1,sizeof(struct ast_comment)+strlen(buffer)+1);
strcpy(x->cmt, buffer);
return x;
struct ast_category {
char name[80];
int ignored; /*!< do not let user of the config see this category */
- int include_level;
+ int include_level;
char *file; /*!< the file name from whence this declaration was read */
int lineno;
struct ast_comment *precomments;
if (work) {
work += strlen(work) - 1;
- /* It's tempting to only want to erase after we exit this loop,
+ /* It's tempting to only want to erase after we exit this loop,
but since ast_trim_blanks *could* receive a constant string
(which we presumably wouldn't have to touch), we shouldn't
actually set anything unless we must, and it's easier just
if (s)
ast_trim_blanks(s);
return s;
-}
+}
)
static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename);
-static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename)
+static struct ast_variable *ast_variable_new(const char *name, const char *value, const char *filename)
{
struct ast_variable *variable;
- int name_len = strlen(name) + 1;
+ int name_len = strlen(name) + 1;
if ((variable = ast_calloc(1, name_len + strlen(value) + 1 + strlen(filename) + 1 + sizeof(*variable)))) {
variable->name = variable->stuff;
- variable->value = variable->stuff + name_len;
- variable->file = variable->value + strlen(value) + 1;
+ variable->value = variable->stuff + name_len;
+ variable->file = variable->value + strlen(value) + 1;
strcpy(variable->name,name);
strcpy(variable->value,value);
strcpy(variable->file,filename);
static struct ast_config_include *ast_include_new(struct ast_config *conf, const char *from_file, const char *included_file, int is_exec, const char *exec_file, int from_lineno, char *real_included_file_name, int real_included_file_name_size)
{
/* a file should be included ONCE. Otherwise, if one of the instances is changed,
- then all be changed. -- how do we know to include it? -- Handling modified
+ then all be changed. -- how do we know to include it? -- Handling modified
instances is possible, I'd have
to create a new master for each instance. */
struct ast_config_include *inc;
-
+
inc = ast_include_find(conf, included_file);
if (inc)
{
ast_log(LOG_WARNING,"'%s', line %d: Same File included more than once! This data will be saved in %s if saved back to disk.\n", from_file, from_lineno, real_included_file_name);
} else
*real_included_file_name = 0;
-
+
inc = ast_calloc(1,sizeof(struct ast_config_include));
inc->include_location_file = ast_strdup(from_file);
inc->include_location_lineno = from_lineno;
inc->included_file = ast_strdup(real_included_file_name);
else
inc->included_file = ast_strdup(included_file);
-
+
inc->exec = is_exec;
if (is_exec)
inc->exec_file = ast_strdup(exec_file);
-
+
/* attach this new struct to the conf struct */
inc->next = conf->includes;
conf->includes = inc;
-
+
return inc;
}
struct ast_config_include *incl;
struct ast_category *cat;
struct ast_variable *v;
-
+
int from_len = strlen(from_file);
int to_len = strlen(to_file);
-
+
if (strcmp(from_file, to_file) == 0) /* no use wasting time if the name is the same */
return;
-
+
/* the manager code allows you to read in one config file, then
write it back out under a different name. But, the new arrangement
ties output lines to the file name. So, before you try to write
*/
/* file names are on categories, includes (of course), and on variables. So,
traverse all this and swap names */
-
+
for (incl = conf->includes; incl; incl=incl->next) {
if (strcmp(incl->include_location_file,from_file) == 0) {
if (from_len >= to_len)
return new;
}
-
+
static void ast_variables_destroy(struct ast_variable *v)
{
struct ast_variable *vn;
static void ast_includes_destroy(struct ast_config_include *incls)
{
struct ast_config_include *incl,*inclnext;
-
+
for (incl=incls; incl; incl = inclnext) {
inclnext = incl->next;
if (incl->include_location_file)
return;
ast_includes_destroy(cfg->includes);
-
+
cat = cfg->root;
while (cat) {
ast_variables_destroy(cat->root);
*/
#define AST_RWLIST_RDLOCK(head) \
ast_rwlock_rdlock(&(head)->lock)
-
+
/*!
\brief Attempts to unlock a read/write based list.
\param head This is a pointer to the list head structure
}
#define AST_RWLIST_ENTRY AST_LIST_ENTRY
-
+
/*!
\brief Returns the first entry contained in a list.
\param head This is a pointer to the list head structure
AST_LIST_ENTRY(ast_switch) list;
const char *name; /*!< Name of the switch */
const char *description; /*!< Description of the switch */
-
+
ast_switch_f *exists;
ast_switch_f *canmatch;
ast_switch_f *exec;
}
/* experiment 1: see if it's easier just to use existing config code
- * to read in the extensions.conf file. In this scenario,
+ * to read in the extensions.conf file. In this scenario,
I have to rip/copy code from other modules, because they
are staticly declared as-is. A solution would be to move
the ripped code to another location and make them available
{
va_list vars;
va_start(vars,fmt);
-
+
printf("LOG: lev:%d file:%s line:%d func: %s ",
level, file, line, function);
vprintf(fmt, vars);
{
va_list vars;
va_start(vars,fmt);
-
+
printf("VERBOSE: ");
vprintf(fmt, vars);
fflush(stdout);
/*! \brief Structure for dial plan hints
\note Hints are pointers from an extension in the dialplan to one or
- more devices (tech/name)
+ more devices (tech/name)
- See \ref AstExtState
*/
struct ast_hint {
#define STATUS_SUCCESS 5
static struct ast_var_t *ast_var_assign(const char *name, const char *value)
-{
+{
struct ast_var_t *var;
int name_len = strlen(name) + 1;
int value_len = strlen(value) + 1;
ast_copy_string(var->name, name, name_len);
var->value = var->name + name_len;
ast_copy_string(var->value, value, value_len);
-
+
return var;
-}
-
+}
+
static void ast_var_delete(struct ast_var_t *var)
{
free(var);
}
/*! \brief Find realtime engine for realtime family */
-static struct ast_config_engine *find_engine(const char *family, char *database, int dbsiz, char *table, int tabsiz)
+static struct ast_config_engine *find_engine(const char *family, char *database, int dbsiz, char *table, int tabsiz)
{
struct ast_config_engine *eng, *ret = NULL;
struct ast_config_map *map;
ret = eng;
}
}
-
-
+
+
/* if we found a mapping, but the engine is not available, then issue a warning */
if (map && !ret)
ast_log(LOG_WARNING, "Realtime mapping for '%s' found to engine '%s', but the engine is not available\n", map->name, map->driver);
-
+
return ret;
}
ast_variables_destroy(cat->root);
if (cat->file)
free(cat->file);
-
+
free(cat);
}
char db[256];
char table[256];
struct ast_config_engine *loader = &text_file_engine;
- struct ast_config *result;
+ struct ast_config *result;
if (cfg->include_level == cfg->max_include_level) {
ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);
}
result = loader->load_func(db, table, filename, cfg, withcomments, suggested_incl_file);
- /* silence is golden
+ /* silence is golden
ast_log(LOG_WARNING, "finished internal loading file %s level=%d\n", filename, cfg->include_level);
*/
return -1;
}
(*cat)->lineno = lineno;
-
+
/* add comments */
if (withcomments && comment_buffer && comment_buffer[0] ) {
newcat->precomments = ALLOC_COMMENT(comment_buffer);
}
if( withcomments )
CB_RESET();
-
+
/* If there are options or categories to inherit from, process them now */
if (c) {
if (!(cur = strchr(c, ')'))) {
}
} else {
struct ast_category *base;
-
+
base = category_get(cfg, cur, 1);
if (!base) {
ast_log(LOG_WARNING, "Inheritance requested, but category '%s' does not exist, line %d of %s\n", cur, lineno, configfile);
c = ast_skip_blanks(c + 1);
if (!*c)
c = NULL;
- } else
+ } else
c = NULL;
do_include = !strcasecmp(cur, "include");
if(!do_include)
if (c) {
char *cur2;
char real_inclusion_name[256];
-
+
/* Strip off leading and trailing "'s and <>'s */
while((*c == '<') || (*c == '>') || (*c == '\"')) c++;
/* Get rid of leading mess */
}
/* #exec </path/to/executable>
We create a tmp file, then we #include it, then we delete it. */
- if (do_exec) {
+ if (do_exec) {
snprintf(exec_file, sizeof(exec_file), "/var/tmp/exec.%d.%ld", (int)time(NULL), (long)pthread_self());
snprintf(cmd, sizeof(cmd), "%s > %s 2>&1", cur, exec_file);
ast_safe_system(cmd);
exec_file[0] = '\0';
/* A #include */
/* ast_log(LOG_WARNING, "Reading in included file %s withcomments=%d\n", cur, withcomments); */
-
+
/* record this inclusion */
ast_include_new(cfg, configfile, cur, do_exec, cur2, lineno, real_inclusion_name, sizeof(real_inclusion_name));
-
+
do_include = ast_config_internal_load(cur, cfg, withcomments, real_inclusion_name) ? 1 : 0;
if(!ast_strlen_zero(exec_file))
unlink(exec_file);
if(!do_include)
return 0;
/* ast_log(LOG_WARNING, "Done reading in included file %s withcomments=%d\n", cur, withcomments); */
-
+
} else {
- ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",
+ ast_log(LOG_WARNING, "Directive '#%s' needs an argument (%s) at line %d of %s\n",
do_exec ? "exec" : "include",
do_exec ? "/path/to/executable" : "filename",
lineno,
configfile);
}
}
- else
+ else
ast_log(LOG_WARNING, "Unknown directive '%s' at line %d of %s\n", cur, lineno, configfile);
} else {
/* Just a line (variable = value) */
}
if( withcomments )
CB_RESET();
-
+
} else {
return -1;
}
struct ast_category *cat = NULL;
int count = 0;
struct stat statbuf;
-
+
cat = ast_config_get_current_category(cfg);
if (filename[0] == '/') {
if (withcomments && cfg && cfg->include_level < 2 ) {
CB_INIT();
}
-
+
#ifdef AST_INCLUDE_GLOB
{
int glob_ret;
while(!feof(f)) {
lineno++;
if (fgets(buf, sizeof(buf), f)) {
- if ( withcomments ) {
+ if ( withcomments ) {
CB_ADD(lline_buffer); /* add the current lline buffer to the comment buffer */
lline_buffer[0] = 0; /* erase the lline buffer */
}
-
+
new_buf = buf;
- if (comment)
+ if (comment)
process_buf = NULL;
else
process_buf = buf;
-
+
while ((comment_p = strchr(new_buf, COMMENT_META))) {
if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
/* Yuck, gotta memmove */
CB_ADD(";");
CB_ADD_LEN(oldptr+1,new_buf-oldptr-1);
}
-
+
memmove(oldptr, new_buf, strlen(new_buf) + 1);
new_buf = oldptr;
} else
}
} else {
if (!comment) {
- /* If ; is found, and we are not nested in a comment,
+ /* If ; is found, and we are not nested in a comment,
we immediately stop all comment processing */
if ( withcomments ) {
LLB_ADD(comment_p);
}
- *comment_p = '\0';
+ *comment_p = '\0';
new_buf = comment_p;
} else
new_buf = comment_p + 1;
{
CB_ADD(buf); /* the whole line is a comment, store it */
}
-
+
if (process_buf) {
char *stripped_process_buf = ast_strip(process_buf);
if (!ast_strlen_zero(stripped_process_buf)) {
}
}
}
- fclose(f);
+ fclose(f);
} while(0);
if (comment) {
ast_log(LOG_WARNING,"Unterminated comment detected beginning on line %d\n", nest[comment]);
}
#endif
if (cfg && cfg->include_level == 1 && withcomments && comment_buffer) {
- if (comment_buffer) {
+ if (comment_buffer) {
free(comment_buffer);
free(lline_buffer);
- comment_buffer=0;
- lline_buffer=0;
- comment_buffer_size=0;
+ comment_buffer=0;
+ lline_buffer=0;
+ comment_buffer_size=0;
lline_buffer_size=0;
}
}
static struct ast_config *ast_config_new(void) ;
-static struct ast_config *ast_config_new(void)
+static struct ast_config *ast_config_new(void)
{
struct ast_config *config;
}
static char *ast_category_browse(struct ast_config *config, const char *prev)
-{
+{
struct ast_category *cat = NULL;
if (prev && config->last_browse && (config->last_browse->name == prev))
}
}
}
-
+
if (cat)
cat = next_available_category(cat);
/* NOTE: categories and variables each have a file and lineno attribute. On a save operation, these are used to determine
which file and line number to write out to. Thus, an entire hierarchy of config files (via #include statements) can be
recreated. BUT, care must be taken to make sure that every cat and var has the proper file name stored, or you may
- be shocked and mystified as to why things are not showing up in the files!
-
+ be shocked and mystified as to why things are not showing up in the files!
+
Also, All #include/#exec statements are recorded in the "includes" LL in the ast_config structure. The file name
and line number are stored for each include, plus the name of the file included, so that these statements may be
- included in the output files on a file_save operation.
-
+ included in the output files on a file_save operation.
+
The lineno's are really just for relative placement in the file. There is no attempt to make sure that blank lines
are included to keep the lineno's the same between input and output. The lineno fields are used mainly to determine
the position of the #include and #exec directives. So, blank lines tend to disappear from a read/rewrite operation,
and a header gets added.
-
+
vars and category heads are output in the order they are stored in the config file. So, if the software
shuffles these at all, then the placement of #include directives might get a little mixed up, because the
file/lineno data probably won't get changed.
-
+
*/
static void gen_header(FILE *f1, const char *configfile, const char *fn, const char *generator)
time_t t;
time(&t);
ast_copy_string(date, ctime(&t), sizeof(date));
-
+
fprintf(f1, ";!\n");
fprintf(f1, ";! Automatically generated configuration file\n");
if (strcmp(configfile, fn))
ast_copy_string(fn, configfile, fn_size);
else
snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, configfile);
- } else if (file[0] == '/')
+ } else if (file[0] == '/')
ast_copy_string(fn, file, fn_size);
else
snprintf(fn, fn_size, "%s/%s", ast_config_AST_CONFIG_DIR, file);
struct ast_comment *cmt;
struct ast_config_include *incl;
int blanklines = 0;
-
+
/* reset all the output flags, in case this isn't our first time saving this data */
-
+
for (incl=cfg->includes; incl; incl = incl->next)
incl->output = 0;
-
+
/* go thru all the inclusions and make sure all the files involved (configfile plus all its inclusions)
are all truncated to zero bytes and have that nice header*/
-
+
for (incl=cfg->includes; incl; incl = incl->next)
{
if (!incl->exec) { /* leave the execs alone -- we'll write out the #exec directives, but won't zero out the include files or exec files*/
FILE *f1;
-
+
set_fn(fn, sizeof(fn), incl->included_file, configfile); /* normally, fn is just set to incl->included_file, prepended with config dir if relative */
f1 = fopen(fn,"w");
if (f1) {
}
}
}
-
+
set_fn(fn, sizeof(fn), 0, configfile); /* just set fn to absolute ver of configfile */
-#ifdef __CYGWIN__
+#ifdef __CYGWIN__
if ((f = fopen(fn, "w+"))) {
#else
if ((f = fopen(fn, "w"))) {
-#endif
+#endif
if (option_verbose > 1)
ast_verbose(VERBOSE_PREFIX_2 "Saving '%s': ", fn);
gen_header(f, configfile, fn, generator);
cat = cfg->root;
fclose(f);
-
+
/* from here out, we open each involved file and concat the stuff we need to add to the end and immediately close... */
- /* since each var, cat, and associated comments can come from any file, we have to be
+ /* since each var, cat, and associated comments can come from any file, we have to be
mobile, and open each file, print, and close it on an entry-by-entry basis */
-
+
while(cat) {
set_fn(fn, sizeof(fn), cat->file, configfile);
f = fopen(fn, "a");
ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
return -1;
}
-
+
/* dump any includes that happen before this category header */
for (incl=cfg->includes; incl; incl = incl->next) {
if (strcmp(incl->include_location_file, cat->file) == 0){
}
}
}
-
+
/* Dump section with any appropriate comment */
for (cmt = cat->precomments; cmt; cmt=cmt->next) {
if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
if (!cat->sameline)
fprintf(f,"\n");
fclose(f);
-
+
var = cat->root;
while(var) {
set_fn(fn, sizeof(fn), var->file, configfile);
ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
return -1;
}
-
+
/* dump any includes that happen before this category header */
for (incl=cfg->includes; incl; incl = incl->next) {
if (strcmp(incl->include_location_file, var->file) == 0){
}
}
}
-
+
for (cmt = var->precomments; cmt; cmt=cmt->next) {
if (cmt->cmt[0] != ';' || cmt->cmt[1] != '!')
fprintf(f,"%s", cmt->cmt);
}
- if (var->sameline)
+ if (var->sameline)
fprintf(f, "%s %s %s %s", var->name, (var->object ? "=>" : "="), var->value, var->sameline->cmt);
- else
+ else
fprintf(f, "%s %s %s\n", var->name, (var->object ? "=>" : "="), var->value);
if (var->blanklines) {
blanklines = var->blanklines;
while (blanklines--)
fprintf(f, "\n");
}
-
+
fclose(f);
-
-
+
+
var = var->next;
}
cat = cat->next;
/* Now, for files with trailing #include/#exec statements,
we have to make sure every entry is output */
-
+
for (incl=cfg->includes; incl; incl = incl->next) {
if (!incl->output) {
/* open the respective file */
ast_verbose(VERBOSE_PREFIX_2 "Unable to write %s (%s)", fn, strerror(errno));
return -1;
}
-
+
/* output the respective include */
if (incl->exec)
fprintf(f,"#exec \"%s\"\n", incl->exec_file);
incl->output = 1;
}
}
-
+
return 0;
}
break;
}
/* locate end of set */
- end = strchr(*p, ']');
+ end = strchr(*p, ']');
if (end == NULL) {
ast_log(LOG_WARNING, "Wrong usage of [] in the extension\n");
static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
- struct ast_context *bypass,
+ struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action);
static struct ast_exten *pbx_find_extension(struct ast_channel *chan,
- struct ast_context *bypass,
+ struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action)
{
int x;
continue;
}
/* No need to Substitute variables now; we shouldn't be here if there's any */
-
+
/* equivalent of extension_match_core() at the switch level */
if (action == E_CANMATCH)
aswf = asw->canmatch;
struct ast_exten *localized_find_extension(struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action);
struct ast_exten *localized_find_extension(struct ast_context *bypass,
struct pbx_find_info *q,
- const char *context,
- const char *exten,
+ const char *context,
+ const char *exten,
int priority,
- const char *label,
- const char *callerid,
+ const char *label,
+ const char *callerid,
enum ext_match_t action)
{
return pbx_find_extension(NULL, bypass, q, context, exten, priority, label, callerid, action);
int offset, length;
int i, need_substring;
struct varshead *places[2] = { headp, &globals }; /* list of places where we may look */
-
+
/*
* Make a copy of var because parse_variable_name() modifies the string.
* Then if called directly, we might need to run substring() on the result;
*/
tmpvar = ast_strdupa(var); /* parse_variable_name modifies the string */
need_substring = parse_variable_name(tmpvar, &offset, &length, &i /* ignored */);
-
+
/*
* Look first into predefined variables, then into variable lists.
* Variable 's' points to the result, according to the following rules:
if (!strcmp(var, "EPOCH")) {
snprintf(workspace, workspacelen, "%u",(int)time(NULL));
}
-
+
s = workspace;
}
/* if not found, look into chanvars or global vars */
autofallthrough_config = ast_true(aft);
clearglobalvars_config = ast_true(ast_variable_retrieve(cfg, "general", "clearglobalvars"));
- if ((cxt = ast_variable_retrieve(cfg, "general", "userscontext")))
+ if ((cxt = ast_variable_retrieve(cfg, "general", "userscontext")))
ast_copy_string(userscontext, cxt, sizeof(userscontext));
else
ast_copy_string(userscontext, "default", sizeof(userscontext));
-
+
for (v = ast_variable_browse(cfg, "globals"); v; v = v->next) {
memset(realvalue, 0, sizeof(realvalue));
pbx_substitute_variables_helper(NULL, v->value, realvalue, sizeof(realvalue) - 1);
printf("Context: %s\n", con->name);
}
printf("=========\n");
-
+
return 0;
}
gettimeofday(&t, NULL);
return t;
}
-
* Name: frame.c
* Version: see static char *standardversion, below.
* Author: Mark Roberts <mark@manumark.de>
- * Michael Labuschke <michael@labuschke.de> sys_errlist fixes
- *
+ * Michael Labuschke <michael@labuschke.de> sys_errlist fixes
+ *
****************************************************************************/
/****************************************************************************
* These are useful functions that all DSP programs might find handy
}
/*-------------------------------------------------*
- * Set samplefrequency, width, wavout,
+ * Set samplefrequency, width, wavout,
*-------------------------------------------------*/
parseintarg( argcount, args, "f", &samplefrequency);
wavout = parseswitcharg( argcount, args, "h");
}
free( buffer);
}
-
void readpkheader( FILE *anyin);
/* -----------------------------------------------------------------------
- Read a .WAV header from 'anyin'.
+ Read a .WAV header from 'anyin'.
If it is recognised, the data is used.
Otherwise, we assume it's PCM-data and ignore the header.
The global variable 'iswav' is set on success, otherwise cleared.
*
* Mark Spencer <markster@digium.com>
*
- * Updated for Mac OSX CoreAudio
+ * Updated for Mac OSX CoreAudio
* by Josh Roberson <josh@asteriasgi.com>
*
* See http://www.asterisk.org for more information about
*
* \author Mark Spencer <markster@digium.com>
*
- * Updated for Mac OSX CoreAudio
+ * Updated for Mac OSX CoreAudio
* \arg Josh Roberson <josh@asteriasgi.com>
*
* \note Specially written for Malcolm Davenport, but I think I'll use it too
#include "asterisk/autoconfig.h"
#ifdef __Darwin__
-#include <CoreAudio/AudioHardware.h>
+#include <CoreAudio/AudioHardware.h>
#include <sys/types.h>
#include <pwd.h>
#include <sys/stat.h>
chan->next = channels;
channels = chan;
}
-
+
}
static int load_config(void)
} else if (!strcasecmp(buf, "mutelevel")) {
if (val && (sscanf(val, "%3d", &x) == 1) && (x > -1) && (x < 101)) {
mutelevel = x;
- } else
+ } else
fprintf(stderr, "mutelevel must be a number from 0 (most muted) to 100 (no mute) at line %d\n", lineno);
} else if (!strcasecmp(buf, "channel")) {
if (val && strlen(val)) {
fprintf(stderr, "no 'host' specification in config file\n");
else if (!strlen(user))
fprintf(stderr, "no 'user' specification in config file\n");
- else if (!channels)
+ else if (!channels)
fprintf(stderr, "no 'channel' specifications in config file\n");
else
return 0;
fprintf(stderr, "disconnected (1)\n");
return -1;
}
- fprintf(astf,
+ fprintf(astf,
"Action: Login\r\n"
"Username: %s\r\n"
"Secret: %s\r\n\r\n", user, pass);
fprintf(stderr, "disconnected (3)\n");
return -1;
}
- fprintf(astf,
+ fprintf(astf,
"Action: Status\r\n\r\n");
if (!(welcome = get_line())) {
fprintf(stderr, "disconnected (4)\n");
{
#ifndef __Darwin__
if (ioctl(mixfd, MIXER_WRITE(mixchan), &vol)) {
-#else
+#else
float volumeL = vol;
float volumeR = vol;
OSStatus err;
master = level * master / 100.0;
return master;
#endif
-
+
}
static void mute(void)
vol = getvol();
oldvol = vol;
if (smoothfade)
-#ifdef __Darwin__
+#ifdef __Darwin__
start = mutelevel;
#else
start = 100;
struct subchannel *sub;
sub = chan->subs;
while(sub) {
- if (!strcasecmp(sub->name, name))
+ if (!strcasecmp(sub->name, name))
return;
sub = sub->next;
}
strncpy(oldname, resp + strlen("Oldname: "), sizeof(oldname) - 1);
}
if (strlen(channel)) {
- if (!strcasecmp(event, "Hangup"))
+ if (!strcasecmp(event, "Hangup"))
hangup_chan(channel);
else
offhook_chan(channel);
exit(1);
}
if (login_asterisk()) {
-#ifndef __Darwin__
+#ifndef __Darwin__
close(mixfd);
#endif
fclose(astf);
/*!
* \brief reads next USC character from null terminated UTF-8 string and advanced pointer
* for non valid UTF-8 sequences.
- * \return character as is Does \b NOT advance pointer for null termination
+ * \return character as is Does \b NOT advance pointer for null termination
*/
static int utf8decode (unsigned char **pp)
{
return *p; /* not sensible */
}
-/*!
+/*!
* \brief check for any queued messages in specific queue (queue="" means any queue)
* \param dir,queue,subaddress,channel,callerid,wait,delay,retries,concurrent
* \retval 0 if nothing queued
* \retval 1 if queued and outgoing set up OK
- * \retval 2 of outgoing exists
+ * \retval 2 of outgoing exists
*/
static char txqcheck (char *dir, char *queue, char subaddress, char *channel, char *callerid, int wait, int delay, int retries, int concurrent)
{
return 2;
}
-/*!
+/*!
* \brief Process received queue entries
* Run through a process, setting environment variables
*/
channels = 2; /* Output files are stereo */
if (wavout)
{
- if ((strcmp(outfilename,"<stdout>")!=0) && (fseek( out, 0, SEEK_SET) != 0))
+ if ((strcmp(outfilename,"<stdout>")!=0) && (fseek( out, 0, SEEK_SET) != 0))
fatalerror("Couldn't navigate output file '%s': %s\n",outfilename, strerror(errno));
makewavheader();
}
/*!
* \file
* \author Russell Bryant <russell@digium.com>
- *
+ *
* \brief A utility for reading from a raw TCP stream
*
* This application is intended for use when a raw TCP stream is desired to be
}
memset(&sin, 0, sizeof(sin));
-
+
sin.sin_family = AF_INET;
sin.sin_port = htons(atoi(argv[2]));
memcpy(&sin.sin_addr, hp->h_addr, sizeof(sin.sin_addr));
-
+
s = socket(AF_INET, SOCK_STREAM, 0);
-
+
if (s < 0) {
fprintf(stderr, "Unable to allocate socket!\n");
exit(1);
- }
+ }
res = connect(s, (struct sockaddr *)&sin, sizeof(sin));
-
+
if (res) {
fprintf(stderr, "Unable to connect to host!\n");
close(s);
- exit(1);
+ exit(1);
}
while (1) {
res = read(s, buf, sizeof(buf));
if (res < 1)
- break;
-
- memset(&tv, 0, sizeof(tv));
+ break;
+
+ memset(&tv, 0, sizeof(tv));
FD_ZERO(&wfds);
FD_SET(1, &wfds);