public static string ScriptExtractValue(ILegacyLogger i_Logger, string i_sVmcId, ISubdocContext i_SubdocContext, string i_sString) { string sRet = ""; // FIX - Should also check for integers if ((i_sString[0] == '\"') || (i_sString[0] == '\'')) { sRet = ScriptExtractStringValue(i_sString); } else { DVariable dvTmp = DialogEngine.DialogEngine.FindVariableByName(i_SubdocContext, i_sString); if (dvTmp == null) { i_Logger.Log(Level.Exception, String.Format("[{0}]DialogEngine.ScriptExtractValue - Couldn't find variable named '{1}' in {2} '{3}'.", i_sVmcId, i_sString, ((i_SubdocContext.GetType() == typeof(DForm)) ? "form" : "field"), i_SubdocContext.ID)); } else { sRet = dvTmp.SValue; } } return(sRet); }
/// <summary> /// Note: Until javascript in Mono is complete and stable, this will interpret the script code. /// For simplicity's sake, the only supported format is: /// variable = FullQualifiedObject(param0, param1, ...); /// The variable is expected to be in field scope, and is optional. Parameters can only be of /// type string, and are always passed by value. /// </summary> /// <param name="i_dfActive"></param> /// <param name="i_iOptionIndex"></param> /// <returns></returns> // public static bool ScriptExecute(ILegacyLogger i_Logger, string i_sVmcId, DField i_dfField, DAction i_daAction) public static bool ScriptExecute(ILegacyLogger i_Logger, string i_sVmcId, ISubdocContext i_SubdocContext, DAction i_daAction) { bool bRet = true, bRes = true; int ii = 0, iIndexStart = 0; System.Int32 iTmp = 0; // I know, same as 'int', but... DScript dsCode; string sStatement, sVarName, sVarNameShort, sRes = ""; DVariable dvTmp = null; try { // FIX - The parsing code is currently a hack to get a demo working. // FIX - The variables we look for in the javascript may be VoiceXML variables. // Right now we only handle two types of statements: variable declarations (with or // without assignment) and function calls (w/ or w/out assignment.) All parameters and // return values from function calls are of type string. Any text results to be TTSed // need to be done through the reserved statement 'document.writeln(svar);'. // dsCode = (DScript)i_daAction.m_oValue; for (ii = 0; ii < dsCode.Code.Count; ii++) { dvTmp = null; sStatement = dsCode.Code[ii]; // Check if there is a variable declared if (sStatement.IndexOf("var ") >= 0) { sVarName = ScriptExtractVariableName(sStatement.Substring(4)); iTmp = sVarName.IndexOf('.'); if (iTmp < 0) { sVarNameShort = sVarName; } else { sVarNameShort = sVarName.Substring(iTmp + 1); } dvTmp = DialogEngine.DialogEngine.FindVariableByName(i_SubdocContext, sVarName); // Reuse variable if it exists, even though script has (erroneously) declared a new one. if (dvTmp == null) { // Allocate variable and put it in proper scope. dvTmp = new DVariable(); dvTmp.Name = sVarNameShort; iIndexStart = sStatement.IndexOf("var ") + 4; if (i_SubdocContext.GetType() == typeof(DField)) { DField dfField = (DField)i_SubdocContext; if (sVarName.IndexOf("session.") >= 0) { dfField.m_dfParentForm.m_ddParentDocument.m_dsParentSession.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("application.") >= 0) { // FIX - Keep it in session since we don't currently have an "application" in USCs? dfField.m_dfParentForm.m_ddParentDocument.m_dsParentSession.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("document.") >= 0) { dfField.m_dfParentForm.m_ddParentDocument.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("dialog.") >= 0) { dfField.m_dfParentForm.Variables.Add(dvTmp); } else { i_SubdocContext.Variables.Add(dvTmp); } } else if (i_SubdocContext.GetType() == typeof(DForm)) { DForm dfForm = (DForm)i_SubdocContext; if (sVarName.IndexOf("session.") >= 0) { dfForm.m_ddParentDocument.m_dsParentSession.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("application.") >= 0) { // FIX - Keep it in session since we don't currently have an "application" in USCs? dfForm.m_ddParentDocument.m_dsParentSession.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("document.") >= 0) { dfForm.m_ddParentDocument.m_DVariables.Add(dvTmp); } else if (sVarName.IndexOf("dialog.") >= 0) { dfForm.Variables.Add(dvTmp); } else { i_SubdocContext.Variables.Add(dvTmp); } } else { i_Logger.Log(Level.Exception, string.Format("[{0}]DialogEngine.ScriptExecute - invalid type '{1}'.", i_sVmcId, i_SubdocContext.GetType().ToString())); } } } else if (sStatement.IndexOf(m_csBoolEqual) >= 0) { i_Logger.Log(Level.Warning, "[" + i_sVmcId + "]" + "DialogEngine.ScriptExecute - Boolean conditions not yet supported."); } else if (sStatement.IndexOf('=') >= 0) { sVarName = sStatement.Substring(0, sStatement.IndexOfAny(DialogEngine.VoiceXmlParser.s_acBreakNonVar)); dvTmp = DialogEngine.DialogEngine.FindVariableByName(i_SubdocContext, sVarName); if (dvTmp == null) { i_Logger.Log(Level.Exception, "[" + i_sVmcId + "]" + "DialogEngine.ScriptExecute - Variable named '" + sVarName + "' was not found, line " + ii + " '" + sStatement + "'."); // Create a new temporary variable so we can keep going // FIX - probably ought to return a failure if we get here... dvTmp = new DVariable(); dvTmp.Name = sVarName; } } else { // No variable assigned to the return value, so create a temporary variable dvTmp = new DVariable("TEMPORARY", ""); } // if 'var' // Check if there is an assignment iIndexStart = sStatement.IndexOf('='); if (iIndexStart >= 0) { iIndexStart++; bRes = ScriptAssignVariable(i_Logger, i_sVmcId, i_SubdocContext, dvTmp, sStatement.Substring(iIndexStart).Trim()); } else { // Check for a function call that doesn't assign a return value to a variable if (sStatement.IndexOf('(') >= 0) { sRes = ScriptCallFunction(i_Logger, i_sVmcId, i_SubdocContext, sStatement.TrimEnd(DialogEngine.VoiceXmlParser.s_acTerminator)); } else { i_Logger.Log(Level.Info, "[" + i_sVmcId + "]" + "DialogEngine.ExecuteScript - Seem to have found a no-op on line " + ii + ": '" + sStatement + "'."); } } } // for } catch (Exception e) { bRet = false; i_Logger.Log(Level.Exception, "[" + i_sVmcId + "]" + "DialogEngine.ScriptExecute: " + e.ToString()); } return(bRet); }