Example


Calling Card Application: Caller calls an 800 number and after some interaction with an IVR system places and outbound call to a friend.

<ccxml xmlns="http://www.w3.org/2002/09/ccxml"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.w3.org/2002/09/ccxml 
   http://www.w3.org/TR/ccxml/ccxml.xsd" version="1.0">

  <!-- Create our ccxml level vars -->
  <var name="in_callid" expr="''" />
  <var name="out_callid" expr="''" />

  <!-- Set our initial state -->
  <assign name="currentstate" expr="'initial'" />

  <eventhandler statevariable="currentstate">
    <!-- Deal with the incoming call -->
    <transition state="initial"
    event="connection.ALERTING" name="evt">
      <assign name="in_callid" expr="evt.callid" />
      <accept callid="in_callid" />
    </transition>

    <transition state="initial" event="connection.CONNECTED"
     name="evt">
      <assign name="currentstate" expr="'in_vxml_session'" />
      <!-- VoiceXML dialog is started on a separate
       thread - see pin.vxml -->
      <dialogstart callid="in_callid" src="'pin.vxml'" />
    </transition>

    <!-- happens when pin.vxml VoiceXML dialog thread exits -->
    <transition state="in_vxml_session" event="dialog.exit" name="evt">
      <createcall dest="evt.values.telnum" name="out_callid" />
      <assign name="currentstate" expr="'calling'" />
    </transition>

    <transition state="calling" event="connection.FAILED" name="evt">
      <!-- tell the caller there was a error -->
      <dialogstart callid="in_callid" src="'error.vxml'" />
      <assign name="currentstate" expr="'oub_failed'" />
    </transition>

    <!-- happens when called party picks up the phone -->
    <transition state="calling" event="connection.CONNECTED"
     name="evt">
      <assign name="out_callid" expr="evt.callid" />
      <!-- tell the callee he is receiving a call -->
      <dialogstart callid="out_callid" src="'callee.vxml'" />
      <assign name="currentstate" expr="'outb_ready_to_join'" />
    </transition>

    <transition state="oub_failed" event="dialog.exit" name="evt">
      <exit />
    </transition>

    <!-- happens when callee's vxml dialog (callee.vxml exits) -->
    <transition state="outb_ready_to_join" event="dialog.exit"
     name="evt">
      <join id1="in_callid" id2="out_callid" />
      <assign name="currentstate" expr="'wtg_for_joined'" />
    </transition>

    <transition state="wtg_for_joined" event="ccxml.joined"
     name="evt">
      <assign name="currentstate" expr="'active'" />
    </transition>

    <!-- Lets clean up the call  -->
    <transition state="active" event="connection.DISCONNECT"
     name="evt">
      <if cond="evt.callid == in_callid">
        <disconnect callid="out_callid"/>
        <exit />
      </if>
      <assign name="currentstate" expr="'in_vxml_session'" />
      <!-- start VoiceXML dialog again to see
        if caller wants to make another call -->
      <dialogstart callid="in_callid" src="'pin.vxml'" />
    </transition>

    <!-- Catch disconnects in unexpected states -->
    <transition event="connection.DISCONNECT">
      <exit />
    </transition>
  </eventhandler>
</ccxml>