mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-02-10 18:57:45 +00:00
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@13896 d0543943-73ff-0310-b7d9-9358b9ac24b2
237 lines
6.3 KiB
JavaScript
237 lines
6.3 KiB
JavaScript
/*
|
|
* File: s25vmail.js
|
|
* Purpose: Invoke voicemail based on AT&T System 25 PBX voicemail mode codes
|
|
* Machine: OS:
|
|
* Author: John Wehle Date: June 24, 2008
|
|
*
|
|
* The message waiting indicator is handled by a separate program.
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2008 Feith Systems and Software, Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* * Neither the name of the original author; nor the names of any contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
|
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
|
|
var id_digits_required = 3;
|
|
|
|
var digitTimeOut = 3000;
|
|
var interDigitTimeOut = 1000;
|
|
var absoluteTimeOut = 10000;
|
|
|
|
|
|
var dtmf_digits = "";
|
|
|
|
function on_dtmf (session, type, obj, arg)
|
|
{
|
|
|
|
if (type == "dtmf") {
|
|
dtmf_digits += obj.digit;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
function prompt_for_id ()
|
|
{
|
|
var dto;
|
|
var id;
|
|
var index;
|
|
var repeat;
|
|
|
|
dtmf_digits = "";
|
|
id = "";
|
|
repeat = 0;
|
|
|
|
while (session.ready () && repeat < 3) {
|
|
session.flushDigits ();
|
|
|
|
/* play phrase - if digit keyed while playing callback will catch them*/
|
|
session.sayPhrase ("voicemail_enter_id", "#", "", on_dtmf, "");
|
|
|
|
if (! session.ready ())
|
|
return "";
|
|
|
|
id = dtmf_digits;
|
|
|
|
if (id.indexOf ('#') == -1) {
|
|
dto = digitTimeOut;
|
|
if (dtmf_digits.length != 0)
|
|
dto = interDigitTimeOut;
|
|
dtmf_digits = session.getDigits (5, '#', dto,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
id += dtmf_digits;
|
|
id += '#';
|
|
}
|
|
|
|
/* a valid id must meet the minimum length requirements */
|
|
if ((index = id.indexOf ('#')) >= id_digits_required) {
|
|
id = id.substring (0,index);
|
|
break;
|
|
}
|
|
|
|
dtmf_digits = "";
|
|
id = "";
|
|
repeat++;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
|
|
var start = "";
|
|
var mode = "";
|
|
var from = "";
|
|
var to = "";
|
|
|
|
var domain = session.getVariable ("domain");
|
|
|
|
session.answer ();
|
|
|
|
start = session.getDigits (1, '', digitTimeOut,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
|
|
if (start != "#") {
|
|
var destination_number = session.getVariable ("destination_number");
|
|
|
|
console_log ("err", destination_number + " received an invalid VMAIL start code from PBX\n");
|
|
if (session.ready ())
|
|
session.sayPhrase ("voicemail_goodbye", "#", "", on_dtmf, "");
|
|
else
|
|
console_log ("err", "Possibly due to early hangup from PBX\n");
|
|
session.hangup ();
|
|
exit();
|
|
}
|
|
|
|
mode = session.getDigits (5, '#', digitTimeOut,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
|
|
from = session.getDigits (5, '#', digitTimeOut,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
|
|
to = session.getDigits (5, '#', digitTimeOut,
|
|
interDigitTimeOut, absoluteTimeOut);
|
|
|
|
session.execute("sleep", "1000");
|
|
|
|
// Verify that the proper parameters are present
|
|
switch (mode) {
|
|
|
|
// Direct Inside Access
|
|
case "00":
|
|
if (isNaN (parseInt (from, 10))) {
|
|
console_log ("err", "Invalid VMAIL calling PDC from PBX\n");
|
|
break;
|
|
}
|
|
|
|
session.setVariable ("voicemail_authorized", "false");
|
|
session.execute ("voicemail", "check default " + domain + " " + from);
|
|
break;
|
|
|
|
// Direct Dial Access
|
|
case "01":
|
|
from = prompt_for_id ();
|
|
|
|
if (! session.ready ()) {
|
|
session.hangup ();
|
|
exit();
|
|
}
|
|
|
|
if (isNaN (parseInt (from, 10))) {
|
|
console_log ("err", "Invalid VMAIL mailbox from caller\n");
|
|
break;
|
|
}
|
|
|
|
session.setVariable ("voicemail_authorized", "false");
|
|
session.execute ("voicemail", "check default " + domain + " " + from);
|
|
break;
|
|
|
|
// Coverage - caller is inside
|
|
case "02":
|
|
if (isNaN (parseInt (from, 10)) || isNaN (parseInt (to, 10))) {
|
|
console_log ("err", "Invalid VMAIL calling or called PDC from PBX\n");
|
|
break;
|
|
}
|
|
|
|
session.setVariable ("effective_caller_id_name", "inside caller");
|
|
session.setVariable ("effective_caller_id_number", from);
|
|
|
|
session.execute ("voicemail", "default " + domain + " " + to);
|
|
break;
|
|
|
|
// Coverage - caller is dial
|
|
case "03":
|
|
if (isNaN (parseInt (to, 10))) {
|
|
console_log ("err", "Invalid VMAIL called PDC from PBX\n");
|
|
break;
|
|
}
|
|
|
|
session.setVariable ("effective_caller_id_name", "outside caller");
|
|
session.setVariable ("effective_caller_id_number", "Unknown");
|
|
|
|
session.execute ("voicemail", "default " + domain + " " + to);
|
|
break;
|
|
|
|
// Coverage - not yet defined
|
|
case "04":
|
|
break;
|
|
|
|
// Leave Word Calling
|
|
case "05":
|
|
if (isNaN (parseInt (from, 10)) || isNaN (parseInt (to, 10))) {
|
|
console_log ("err", "Invalid VMAIL calling or called PDC from PBX\n");
|
|
break;
|
|
}
|
|
break;
|
|
|
|
// Refresh MW lamps
|
|
case "06":
|
|
break;
|
|
|
|
// Voice Port failed to answer
|
|
case "08":
|
|
if (isNaN (parseInt (to, 10))) {
|
|
console_log ("err", "Invalid VMAIL PDC from PBX\n");
|
|
break;
|
|
}
|
|
|
|
console_log ("err", "PBX reports problem with VMAIL PDC " + to + "\n");
|
|
break;
|
|
|
|
// Unknown
|
|
default:
|
|
console_log ("err", "Invalid VMAIL mode code from PBX\n");
|
|
break;
|
|
}
|
|
|
|
exit();
|