aboutsummaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-16 08:47:06 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-16 08:47:06 +0000
commit20cc8387a96393f0583cae71150c6fb3146a0f9c (patch)
tree1f680371a147be0a27779ccbad3d383df7c98226 /doc
parent09f5c8d4e6500cf8e46b600a3db64fb110086f46 (diff)
Add Asterisk Extension Language support (AEL) from Astricon talk
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5918 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'doc')
-rwxr-xr-xdoc/README.ael246
1 files changed, 246 insertions, 0 deletions
diff --git a/doc/README.ael b/doc/README.ael
new file mode 100755
index 000000000..ec2d7983b
--- /dev/null
+++ b/doc/README.ael
@@ -0,0 +1,246 @@
+The Asterisk Extension Language
+===================================
+
+Over time, people have been pushing to add features to extensions.conf to make
+it more like a programming language. AEL is intended to provide an actual
+programming language that can be used to write an Asterisk dialplan.
+
+
+Contexts
+-------------------------
+Contexts in AEL represent a set of extensions in the same way that they do
+in extensions.conf.
+
+context default {
+
+};
+
+
+Extensions
+-------------------------
+To specify an extension in a context, the following syntax is used. If more
+than one application is be called in an extension, they can be listed in order
+inside of a block.
+
+context default {
+ 1234 => Playback(tt-monkeys);
+ 8000 => {
+ NoOp(one);
+ NoOp(two);
+ NoOp(three);
+ };
+ _5XXX => NoOp(it's a pattern!);
+};
+
+
+Includes
+-------------------------
+Contexts can be included in other contexts. All included contexts are listed
+within a single block.
+
+context default {
+ includes {
+ local;
+ longdistance;
+ international;
+ };
+};
+
+
+Dialplan Switches
+-------------------------
+Switches are listed in their own block within a context.
+
+context default {
+ switches {
+ DUNDi/e164;
+ IAX2/box5;
+ };
+ eswitches {
+ IAX2/context@${CURSERVER};
+ };
+};
+
+
+Ignorepat
+-------------------------
+ignorepat can be used to instruct channel drivers to not cancel dialtone upon
+receipt of a particular pattern. The most commonly used example is '9'.
+
+context outgoing {
+ ignorepat => 9;
+};
+
+
+Variables
+-------------------------
+Variables in Asterisk do not have a type, so to define a variable, it just has
+to be specified with a value.
+
+Global variables are set in their own block.
+
+globals {
+ CONSOLE=Console/dsp;
+ TRUNK=Zap/g2;
+};
+
+Variables can be set within extensions as well.
+
+context foo {
+ 555 => {
+ x=5;
+ y=blah;
+ NoOp(x is ${x} and y is ${y} !);
+ };
+};
+
+Writing to a dialplan function is treated the same as writing to a variable.
+
+context blah {
+ s => {
+ CALLERID(name)=ChickenMan;
+ NoOp(My name is ${CALLERID(name)} !);
+ };
+};
+
+
+Loops
+-------------------------
+AEL has implementations of 'for' and 'while' loops.
+
+context loops {
+ 1 => {
+ for (x=0; ${x} < 3; x=${x} + 1) {
+ Verbose(x is ${x} !);
+ };
+ };
+ 2 => {
+ y=10;
+ while (${y} >= 0) {
+ Verbose(y is ${y} !);
+ y=${y}-1;
+ };
+ };
+};
+
+
+Conditionals
+-------------------------
+AEL supports if and switch statements. Note that if you have an else
+clause, you MUST place braces around the non-else portion of the if
+statement.
+
+context conditional {
+ _8XXX => {
+ Dial(SIP/${EXTEN});
+ if (${DIALSTATUS} = "BUSY") {
+ Voicemail(${EXTEN}|b);
+ } else
+ Voicemail(${EXTEN}|u);
+ };
+ _777X => {
+ switch (${EXTEN}) {
+ case 7771:
+ NoOp(You called 7771!);
+ break;
+ case 7772:
+ NoOp(You called 7772!);
+ break;
+ case 7773:
+ NoOp(You called 7773!);
+ // fall through
+ default:
+ NoOp(In the default clause!);
+ };
+ };
+};
+
+
+goto and labels
+-------------------------
+This is an example of how to do a goto in AEL.
+
+context gotoexample {
+ s => {
+begin:
+ NoOp(Infinite Loop! yay!);
+ Wait(1);
+ goto begin;
+ };
+};
+
+
+Macros
+-------------------------
+A macro is defined in its own block like this. The arguments to the macro are
+specified with the name of the macro. They are then reffered to by that same
+name. A catch block can be specified to catch special extensions.
+
+macro std-exten( ext , dev ) {
+ Dial(${ext}/${dev},20);
+ switch(${DIALSTATUS) {
+ case BUSY:
+ Voicemail(b${ext});
+ break;
+ default:
+ Voicemail(u${ext});
+ };
+ catch a {
+ VoiceMailMain(${ext});
+ return;
+ };
+};
+
+A macro is then called by preceeding the macro name with an ampersand.
+
+context example {
+ _5XXX => &std-exten(${EXTEN});
+};
+
+
+Examples
+------------------------
+
+context demo {
+ s => {
+ Wait(1);
+ Answer();
+ TIMEOUT(digit)=5;
+ TIMEOUT(response)=10;
+restart:
+ Background(demo-congrats);
+instructions:
+ for (x=0; ${x} < 3; x=${x} + 1) {
+ Background(demo-instruct);
+ WaitExten();
+ };
+ };
+ 2 => {
+ Background(demo-moreinfo);
+ goto instructions;
+ };
+ 3 => {
+ LANGUAGE()=fr;
+ goto restart;
+ };
+ 500 => {
+ Playback(demo-abouttotry);
+ exten => 500,n,Dial(IAX2/guest@misery.digium.com)
+ Playback(demo-nogo);
+ goto instructions;
+ };
+ 600 => {
+ Playback(demo-echotest);
+ Echo();
+ Playback(demo-echodone);
+ goto instructions;
+ };
+ # => {
+hangup:
+ Playback(demo-thanks);
+ Hangup();
+ };
+ t => goto hangup;
+ i => Playback(invalid);
+};
+