Transfer Example
example15.ccxml
xml version="1.0" encoding="UTF-8"
<ccxml version="1.0">
<var name="dialogSrc" expr="'example15a.vxml'"/>
<var name="my_connectionid" />
<var name="out_connectionid" />
<var name="dialogid" />
<var name="results"/>
<var name="mystate" expr="'init'"/>
<eventprocessor statevariable="mystate">
<transition state="init" event="ccxml.loaded">
<dialogprepare src="dialogSrc"
dialogid="dialogid"/>
</transition>
<transition state="init" event="dialog.prepared">
<createcall dest="'*21'"
connectionid="my_connectionid"/>
</transition>
<transition state="init" event="connection.connected">
<dialogstart prepareddialogid="dialogid"
connectionid="event$.connectionid"/>
</transition>
<transition state="init" event="dialog.started">
<log expr="'Connection connected and dialog started.'"/>
<assign name="mystate" expr="'dialogActive'" />
</transition>
<transition state="dialogActive terminatetransfer" event="dialog.exit">
<log expr="'Dialog exited. Terminating.'"/>
<disconnect connectionid="my_connectionid" />
<assign name="mystate" expr="'dialogExited'" />
</transition>
<transition state="dialogExited" event="connection.disconnected">
<if cond="event$.connectionid == my_connectionid">
<exit/>
</if>
</transition>
<transition state="dialogActive" event="dialog.disconnect">
<log expr="'Dialog requests that we disconnect the call'"/>
<disconnect connectionid="event$.connectionid" />
<assign name="mystate" expr="'disconnecting'" />
</transition>
<transition state="disconnecting" event="connection.disconnected">
<dialogterminate dialogid="dialogid" />
</transition>
<transition state="disconnecting" event="dialog.exit">
<exit/>
</transition>
<transition state="dialogActive" event="connection.disconnected">
<send name="'connection.disconnect.hangup'"
target="dialogid"
targettype="'dialog'"/>
<assign name="mystate" expr="'userDisconnect'" />
</transition>
<transition state="userDisconnect" event="dialog.exit">
<exit/>
</transition>
<transition state="dialogActive" event="dialog.transfer">
<log expr="'Dialog requests a transfer.'"/>
<if cond="event$.type == 'blind'">
<assign name="mystate" expr="'redirecting'" />
<redirect connectionid="my_connectionid" dest="event$.URI" />
<else/>
<assign name="mystate" expr="'calling'" />
<createcall dest="event$.URI"
connectionid="out_connectionid"
aai="event$.aai"
timeout="event$.connecttimeout"/>
</if>
</transition>
<transition state="redirecting" event="connection.redirected">
</transition>
<transition state="redirecting" event="connection.failed">
</transition>
<transition state="redirecting" event="dialog.exit">
<log expr="'Dialog exited. Terminating session.'"/>
<exit/>
</transition>
<transition state="calling" event="connection.failed">
<assign name="results" expr="event$.reason"/>
<send name="'dialog.transfer.complete'"
target="dialogid"
targettype="'dialog'"
namelist="results" />
<assign name="mystate" expr="'dialogActive'" />
</transition>
<transition state="calling" event="connection.connected">
<assign name="mystate" expr="'outgoing_call_active'" />
<join id1="my_connectionid" id2="out_connectionid" duplex="'full'" />
</transition>
<transition state="calling" event="dialog.exit">
<exit/>
</transition>
<transition state="outgoing_call_active" event="conference.joined">
<if cond="event$.id1==my_connectionid &&
event$.id2==out_connectionid">
<send name="'dialog.transfer.connected'"
target="dialogid"
targettype="'dialog'"/>
</if>
</transition>
<transition state="outgoing_call_active" event="connection.disconnected">
<if cond="event$.connectionid == out_connectionid">
<assign name="mystate" expr="'backToDialogActive'" />
<if cond="typeof event$.reason != 'undefined'">
<assign name="results" expr="event$.reason" />
<else/>
<assign name="results" expr="'far_end_disconnect'" />
</if>
<join id1="my_connectionid" id2="dialogid" duplex="'full'" />
<else />
<assign name="mystate" expr="'userDisconnected'" />
<disconnect connectionid="out_connectionid"/>
<dialogterminate dialogid="dialogid"/>
</if>
</transition>
<transition state="calling outgoing_call_active"
event="dialog.terminatetransfer">
<log expr="'The dialog requests that we stop the transfer.'"/>
<assign name="mystate" expr="'terminatetransfer'" />
<disconnect connectionid="out_connectionid"/>
</transition>
<transition state="backToDialogActive" event="conference.joined">
<assign name="results" expr="'far_end_disconnect'" />
<send name="'dialog.transfer.complete'"
target="dialogid"
targettype="'dialog'"
namelist="results" />
<assign name="mystate" expr="'dialogActive'" />
</transition>
<transition state="terminatetransfer" event="connection.failed">
<assign name="mystate" expr="'dialogActive'" />
</transition>
<transition state="terminatetransfer" event="connection.disconnected">
<if cond="event$.connectionid == my_connectionid">
<send name="'connection.disconnect.hangup'"
target="dialogid"
targettype="'dialog'"/>
<assign name="mystate" expr="'userDisconnect'" />
<else/>
<join id1="my_connectionid" id2="dialogid"/>
</if>
</transition>
<transition state="terminatetransfer" event="conference.joined">
<assign name="mystate" expr="'dialogActive'" />
</transition>
<transition state="terminatetransfer" event="error.conference.join error.semantic">
</transition>
<transition state="userDisconnected" event="dialog.exit">
<exit/>
</transition>
<transition state="userDisconnected" event="connection.disconnected">
</transition>
<transition event="connection.disconnected">
<log expr="'Connection disconnected.'"/>
<exit/>
</transition>
<transition event="error.send.targetunavailable">
</transition>
</eventprocessor>
</ccxml>
example15a.vxml
xml version="1.0" encoding="UTF-8"
<vxml version="2.0" xmlns="http://www.w3.org/2001/vxml">
<meta name="description" content="transfer example"/>
<meta name="author" content="OptimSys, s.r.o., Czech Republic (http://www.optimsys.cz)"/>
<meta name="copyright" content="free for any purpose"/>
<menu dtmf="true">
<prompt>
Welcome to the main manu. Select one of the following actions:
<enumerate>
Press <value expr="_dtmf"/> for <value expr="_prompt"/>
</enumerate>
</prompt>
<choice next="#blind">
blind transfer
</choice>
<choice next="#bridge">
bridge transfer
</choice>
</menu>
<form id="blind">
<transfer name="t" dest="tel:n/a" connecttimeout="10s" bridge="false">
<prompt>
You will be transferred and never get back.
</prompt>
</transfer>
</form>
<form id="bridge">
<transfer name="t" dest="tel:n/a" connecttimeout="10s" maxtime="20s" bridge="true">
<prompt>
You will be transferred. You will get back when the call is finished or after 20s.
</prompt>
<filled>
<if cond="t == 'busy'">
The line is busy. Please call again later.
<elseif cond="t == 'noanswer'"/>
The call has not been answered. Please call again later.
<else/>
Transfer finished with the following result: <value expr="t"/>
</if>
</filled>
</transfer>
<block>
That's all!
</block>
</form>
</vxml>