- From: Chris Davis <davisc@iivip.com>
- Date: Wed, 15 Dec 2010 09:32:41 -0600
- To: www-voice <www-voice@w3.org>
Hello www-voice,
I've received a couple of emails that indicate there is some confusion
on how to use the VXML <data> tag to send information to CCXML.
Specifically, here is how to process test #447 of 7_2.txml in the CCXML
test suite.
Here is an explanation of how our SPOT browser does this.
The VXML below is 7_2_data.vxml from the CCXML IR test suite.
-----------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<vxml version="2.1" xmlns="http://www.w3.org/2001/vxml" xml:lang="en-US">
<!--
Release 1.1 - 2010-10-22
FIXED: ISSUE-726: version 2.1 replaced by version 2.1 (This is
VoiceXML 2.1, actually)
-->
<var name= "data" expr="'Test'"/>
<var name="name" expr="'dialog.user.test'"/>
<var name="dialogid" expr="session.connection.ccxml.dialogid"/>
<var name="sessionid" expr="session.connection.ccxml.sessionid"/>
<var name="connectionid" expr="session.connection.ccxml.connectionid"/>
<var name="processorType"
expr="session.connection.ccxml.values.IO_ProcessorType"/>
<var name="params_to_pass" expr="undefined"/>
<script>
params_to_pass = new Object();
</script>
<catch event="connection.disconnect.hangup">
<exit namelist="data"/>
</catch>
<form>
<block>
<assign name="params_to_pass.a" expr="1"/>
<assign name="params_to_pass.b" expr="'2'"/>
<data srcexpr="processorType" namelist="dialogid sessionid name
connectionid params_to_pass.a params_to_pass.b" method="post"/>
</block>
</form>
</vxml>
-----------------------------
Note that because passing objects via HTTP has undefined behavior, the
VXML above picks the
individual properties on the namelist. Those must go as strings in the HTTP
Our HTTP POST looks like this:
-----------------------------
POST /spot/ccxml/basichttp HTTP/1.1^M
Host: 206.81.53.137:80^M
Pragma: no-cache^M
Accept: */*^M
User-Agent: iiARCADE/V7.0.0.0^M
Connection: keep-alive^M
Keep-Alive: 300^M
Content-Length: 234^M
Content-Type: application/x-www-form-urlencoded^M
^M
connectionid=000D5656038E79907072427017129242353030_fromMyself&dialogid=dialog.000D5656038E799070724270171292423530121&name=dialog.user.test¶ms_to_pass.a=1¶ms_to_pass.b=2&sessionid=session.000D5656038E7990707242701712924235301
----------------------------------
Our 204 response from CCXML looks like this:
----------------------
HTTP/1.1 204 No Content^M
Date: Wed, 15 Dec 2010 14:33:36 GMT^M
Server: Apache/2.2.3 (CentOS)^M
Content-Length: 95^M
Connection: close^M
Content-Type: text/html; charset=UTF-8^M
----------------------------
These are initially received by CCXML from HTTP as strings:
connectionid 000D5656038E79907072427017129242353030_fromMyself
dialogid dialog.000D5656038E799070724270171292423530121
name dialog.user.test
params_to_pass.a 1
params_to_pass.b 2
sessionid session.000D5656038E7990707242701712924235301
---------------
Because javascript use of a "dot" represents the properties of
an object, it is obvious that params_to_pass must become an object,
this means the the event is now:
connectionid 000D5656038E79907072427017129242353030_fromMyself
dialogid dialog.000D5656038E799070724270171292423530121
name dialog.user.test
params_to_pass { "a": "1" , "b": "2" }
sessionid session.000D5656038E7990707242701712924235301
Note the JSON notation for params_to_pass
----------------------
Now CCXML spec mandates that any received parameters should be
dangled off the values object. See
http://www.w3.org/TR/2010/CR-ccxml-20100401/#dialogEventsErrorDialoguser
The important text under 7.3.10 is "Type" of "values" = ECMA script
object, and "Details" = Return values from the dialog for the user event.
Consequently we create that values object and attach
the params_to_pass object above as a property off the values.
Also, the dialog object is maintained by CCXML so we look up its
javascript object in CCXML memory space(using the dialogid as a search
key) and attach it as a property
also to the dialog.user.test event:
connectionid 000D5656038E79907072427017129242353030_fromMyself
dialog { "_connectionid": "000D5656038E
79907072427017129242353030_fromM
yself" , "_srcid": "36_206.81.53
.137" , "dialogid": "dialog.000D
5656038E799070724270171292423530
121" , "input": "000D5656038E799
07072427017129242353030_fromMyse
lf" , "objecttype": "dialog" , "
outputs": [ "000D5656038E7990707
2427017129242353030_fromMyself"
] , "src": "file://chrisdownload
s/paulo/7_2/7_2_data.vxml" , "ty
pe": "application/voicexml+xml"
}
dialogid dialog.000D5656038E799070724270171292423530121
name dialog.user.test
sessionid session.000D5656038E7990707242701712924235301
values { "params_to_pass": { "a": "1" , "b": "2" } }
----------
Finally, should you happen to dump the javascript event$ received in
<transition event="dialog.user.test" state="ASSERTION_NMBR_447">
you will see:
{ "connectionid": "000D5656038E799070724270171292423530150_fromMyself" ,
"dialog": { "_connectionid":
"000D5656038E799070724270171292423530150_fromMyself" , "_srcid":
"113_206.81.53.137" , "dialogid":
"dialog.000D5656038E799070724270171292423530241" , "input":
"000D5656038E799070724270171292423530150_fromMyself" , "objecttype":
"dialog" , "outputs": [
"000D5656038E799070724270171292423530150_fromMyself" ] , "src":
"file://chrisdownloads/paulo/7_2/7_2_data.vxml" , "type":
"application/voicexml+xml" } , "dialogid":
"dialog.000D5656038E799070724270171292423530241" , "name":
"dialog.user.test" , "sessionid":
"session.000D5656038E7990707242701712924235303" , "values": {
"params_to_pass": { "a": "1" , "b": "2" } } }
-----------
The application could then access "a" from VXML as
$event.values.params_to_pass.a
although in the test suite case it does not.
-----------------------------
Regards,
Chris
--
Chris Davis
Interact Incorporated R&D
512-502-9969x117
Received on Wednesday, 15 December 2010 15:33:20 UTC