<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<tt>Perfect. That would work.<br>
However, after some testing, I realized, that '</tt>timeout<tt>' is
never set.<br>
By looking at switch_ivr_play_say.c, I realized, that you override that
status with the failure' one:<br>
<br>
&nbsp;&nbsp;&nbsp; if ((min_digits &amp;&amp; len &lt; min_digits) || len &lt;
max_digits) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ............<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... This function returns </tt><tt>SWITCH_STATUS_TIMEOUT</tt><br>
<tt>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; status = switch_ivr_collect_digits_count(session,
digit_buffer, digit_buffer_length, max_digits, valid_terminators,
&amp;tb[0], timeout, 0, 0);<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
<br>
&nbsp;&nbsp;&nbsp; if (tb[0]) {<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch_channel_set_variable(channel,
SWITCH_READ_TERMINATOR_USED_VARIABLE, tb);<br>
&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; len = strlen(digit_buffer);<br>
&nbsp;&nbsp;&nbsp; if ((min_digits &amp;&amp; len &lt; min_digits)) {<br>
<b><font color="#ff0000"><big>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; status = SWITCH_STATUS_TOO_SMALL;</big></font><br>
</b>&nbsp;&nbsp;&nbsp; }<br>
<br>
&nbsp;&nbsp;&nbsp; switch (status) {<br>
&nbsp;&nbsp;&nbsp; case SWITCH_STATUS_SUCCESS:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch_channel_set_variable(channel,
SWITCH_READ_RESULT_VARIABLE, "success");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; case SWITCH_STATUS_TIMEOUT:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch_channel_set_variable(channel,
SWITCH_READ_RESULT_VARIABLE, "timeout");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; default:<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch_channel_set_variable(channel,
SWITCH_READ_RESULT_VARIABLE, "failure");<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; }<br>
----------------------------<br>
To correct, use extra if, for example<br>
<br>
if( status != </tt><tt>SWITCH_STATUS_TIMEOUT </tt><tt>)<br>
{<br>
</tt><tt>&nbsp;&nbsp;&nbsp; len = strlen(digit_buffer);<br>
&nbsp;&nbsp;&nbsp; if ((min_digits &amp;&amp; len &lt; min_digits)) {<br>
<b><font color="#ff0000"><big>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; status = SWITCH_STATUS_TOO_SMALL;</big></font><br>
</b>&nbsp;&nbsp;&nbsp; }<br>
</tt>}<br>
<br>
Cheers,<br>
Peter<br>
<br>
Anthony Minessale wrote:
<blockquote
 cite="mid:191c3a030911031240m772912f1t15f1f5d2b64a5881@mail.gmail.com"
 type="cite">We have such a variable called "read_result"<br>
possible vals: success, timeout, failure<br>
  <br>
"read_terminator_used" contains the terminator<br>
  <br>
  <br>
  <div class="gmail_quote">On Tue, Nov 3, 2009 at 2:20 PM, Peter
Volchek <span dir="ltr">&lt;<a moz-do-not-send="true"
 href="mailto:pvolchek@voicemobility.com">pvolchek@voicemobility.com</a>&gt;</span>
wrote:<br>
  <blockquote class="gmail_quote"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hi,<br>
I am having some troubles adopting [session:playAndGetDigits] function<br>
to my application needs.<br>
    <br>
There are three possible outcomes that the function should report on:<br>
1. Success. The required number of of digits was collected and they<br>
match the mask.<br>
2. Fail 1.The entered digits do not match the mask<br>
3. Fail2. Timeout failure<br>
    <br>
Right now, I cannot distinguish between 2 &amp; 3. In both cases, an
empty<br>
string is returned, so I have no idea what was the real failure.<br>
    <br>
4. Success upon termination<br>
That is a tricky one, and I believe, there is a bug in this function.<br>
This function accept the terminators, which should stop digits
collection.<br>
Consider the following function call:<br>
    <br>
digits = session:playAndGetDigits(<br>
&nbsp; &nbsp;0, 5, 1, 3000, "#",<br>
&nbsp; &nbsp;"enter_mailbox_number_or_hit_pound_to_login.wav",<br>
&nbsp; &nbsp;"error.wav",<br>
&nbsp; &nbsp;"\\d*"<br>
&nbsp; &nbsp;);<br>
    <br>
    <br>
Here, I want to collect up to 5 digits, that represent a mailbox number.<br>
Note that I set the minimum value to be 0, as I want "#" itself to be<br>
the sign, that I want to login to my system.<br>
However, when I execute this code and hit "#" immediately, the system<br>
play me an error message. Oops! Well, I changed my digits mask to be<br>
"#", and it did not help either.<br>
BTW, about the last case. If I my digits mask contains the symbol used<br>
in the terminators, then it has to be collected and returned. The<br>
current implementation just uses terminates the collection and does not<br>
include the terminator to the returned string.<br>
    <br>
Possible solutions to determine the function's outcome:<br>
1. Return multiple values (state, digits). That may break tons of the<br>
existing code<br>
2. Set a channel (or session) variable. Similar to C's errno and define<br>
some variables defining the outcome. Below is a summary table that<br>
covers all the cases:<br>
    <br>
------------------------------------------------------<br>
ERRNO &nbsp; &nbsp; &nbsp; | Description<br>
------------------------------------------------------<br>
RET_OK &nbsp; &nbsp; &nbsp;| Maximum number of digits was collected or<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| terminated when in range [min_digits..max_digits-1]<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| or timeout triggered after collecting enough digits<br>
[min_digits..max_digits-1].<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| The collected digits match digits_regex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Returns the collected digits<br>
    <br>
RET_TERM &nbsp; &nbsp;| Terminating before collecting enough digits or when<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| the collected digits do not match digits_regex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Return whatever was collected (for logging)<br>
    <br>
    <br>
RET_TIMEOUT | Did not collect enough digits for the time specified or
when<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| the collected digits do not match digits_regex<br>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| Return whatever was collected (for logging)<br>
    <br>
    <br>
Does it all make sense?<br>
Cheers,<br>
PV<br>
    <br>
    <br>
    <br>
_______________________________________________<br>
FreeSWITCH-dev mailing list<br>
    <a moz-do-not-send="true"
 href="mailto:FreeSWITCH-dev@lists.freeswitch.org">FreeSWITCH-dev@lists.freeswitch.org</a><br>
    <a moz-do-not-send="true"
 href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev"
 target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev</a><br>
UNSUBSCRIBE:<a moz-do-not-send="true"
 href="http://lists.freeswitch.org/mailman/options/freeswitch-dev"
 target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-dev</a><br>
    <a moz-do-not-send="true" href="http://www.freeswitch.org"
 target="_blank">http://www.freeswitch.org</a><br>
  </blockquote>
  </div>
  <br>
  <br clear="all">
  <br>
-- <br>
Anthony Minessale II<br>
  <br>
FreeSWITCH <a moz-do-not-send="true" href="http://www.freeswitch.org/">http://www.freeswitch.org/</a><br>
ClueCon <a moz-do-not-send="true" href="http://www.cluecon.com/">http://www.cluecon.com/</a><br>
Twitter: <a moz-do-not-send="true"
 href="http://twitter.com/FreeSWITCH_wire">http://twitter.com/FreeSWITCH_wire</a><br>
  <br>
AIM: anthm<br>
  <a moz-do-not-send="true"
 href="mailto:MSN%3Aanthony_minessale@hotmail.com">MSN:anthony_minessale@hotmail.com</a><br>
GTALK/JABBER/<a moz-do-not-send="true"
 href="mailto:PAYPAL%3Aanthony.minessale@gmail.com">PAYPAL:anthony.minessale@gmail.com</a><br>
IRC: <a moz-do-not-send="true" href="http://irc.freenode.net">irc.freenode.net</a>
#freeswitch<br>
  <br>
FreeSWITCH Developer Conference<br>
  <a moz-do-not-send="true"
 href="mailto:sip%3A888@conference.freeswitch.org">sip:888@conference.freeswitch.org</a><br>
  <a moz-do-not-send="true"
 href="http://iax:guest@conference.freeswitch.org/888">iax:guest@conference.freeswitch.org/888</a><br>
  <a moz-do-not-send="true"
 href="mailto:googletalk%3Aconf%2B888@conference.freeswitch.org">googletalk:conf+888@conference.freeswitch.org</a><br>
pstn:213-799-1400<br>
  <pre wrap="">
<hr size="4" width="90%">
_______________________________________________
FreeSWITCH-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:FreeSWITCH-dev@lists.freeswitch.org">FreeSWITCH-dev@lists.freeswitch.org</a>
<a class="moz-txt-link-freetext" href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev">http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev</a>
UNSUBSCRIBE:<a class="moz-txt-link-freetext" href="http://lists.freeswitch.org/mailman/options/freeswitch-dev">http://lists.freeswitch.org/mailman/options/freeswitch-dev</a>
<a class="moz-txt-link-freetext" href="http://www.freeswitch.org">http://www.freeswitch.org</a>
  </pre>
</blockquote>
</body>
</html>