示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }