Пример #1
0
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                //
                program.RoutedEventAck.WaitOne(1000);
                //
                try
                {
                    isConditionSatisfied = false;
                    //
                    var result = program.EvaluateCondition();
                    if (result != null && result.Exception != null)
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    else
                    {
                        isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    List <ProgramError> error = new List <ProgramError>()
                    {
                        program.GetFormattedError(ex, true)
                    };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled    = false;
                    RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                }
                //
                callback(program, isConditionSatisfied);
                //
                program.RoutedEventAck.Reset();
            }
        }
Пример #2
0
        // TODO: v1.1 !!!IMPORTANT!!! possibly move this inside ProgramEngineBase.cs class and rename to EvaluateStartupCode
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                // the startup code is not evaluated while the program is running
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                // wait 1 second or a new event
                program.Engine.RoutedEventAck.WaitOne(1000);
                // check if the program is still allowed to run
                if (program.IsRunning || !program.IsEnabled)
                {
                    program.Engine.RoutedEventAck.Reset();
                    continue;
                }
                // evaluate and get result from the code
                try
                {
                    isConditionSatisfied = false;
                    program.WillRun      = false;
                    //
                    var result = program.EvaluateCondition();
                    if (result != null && result.Exception != null)
                    {
                        // runtime error occurred, script is being disabled
                        // so user can notice and fix it
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(result.Exception, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                    else
                    {
                        isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    if (!ex.GetType().Equals(typeof(System.Reflection.TargetException)))
                    {
                        List <ProgramError> error = new List <ProgramError>()
                        {
                            program.GetFormattedError(ex, true)
                        };
                        program.ScriptErrors = JsonConvert.SerializeObject(error);
                        program.IsEnabled    = false;
                        RaiseProgramModuleEvent(program, Properties.RuntimeError, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                    }
                }
                //
                callback(program, isConditionSatisfied);
                //
                program.Engine.RoutedEventAck.Reset();
            }
        }
Пример #3
0
        public void EvaluateProgramConditionAsync(ProgramBlock p, ConditionEvaluationCallback callback)
        {
            p.IsEvaluatingConditionBlock = true;
            Thread evaluatorthread = new Thread(new ThreadStart(delegate()
            {
                bool conditionsatisfied = false;
                //
                while (_enginerunning)
                {
                    if (p.IsRunning || !p.IsEnabled || !_engineenabled)
                    {
                        Thread.Sleep(500); continue;
                    }
                    //
                    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                    sw.Start();
                    try
                    {
                        conditionsatisfied = false;
                        //
                        if (p.Type.ToLower() == "csharp")
                        {
                            MethodRunResult res = p.EvaluateConditionStatement(_homegenie);
                            if (res != null && res.Exception != null)
                            {
                                // runtime error occurred, script is being disabled
                                // so user can notice and fix it
                                p.ScriptErrors = res.Exception.Message + "\n" + res.Exception.StackTrace;
                                p.IsEnabled    = false;
                            }
                            else
                            {
                                conditionsatisfied = (bool)res.ReturnValue;
                            }
                        }
                        else
                        {
                            // it is a Wizard Script
                            conditionsatisfied = (p.Conditions.Count > 0);
                            for (int c = 0; c < p.Conditions.Count; c++)
                            {
                                bool res           = _mcp_verifyCondition(p.Conditions[c]);
                                conditionsatisfied = (conditionsatisfied && res);
                            }
                        }
                        //
                        bool lasteval = p.LastConditionEvaluationResult;
                        p.LastConditionEvaluationResult = conditionsatisfied;
                        //
                        if (p.ConditionType == ConditionType.OnSwitchTrue)
                        {
                            conditionsatisfied = (conditionsatisfied == true && conditionsatisfied != lasteval);
                        }
                        else if (p.ConditionType == ConditionType.OnSwitchFalse)
                        {
                            conditionsatisfied = (conditionsatisfied == false && conditionsatisfied != lasteval);
                        }
                        else if (p.ConditionType == ConditionType.OnTrue || p.ConditionType == ConditionType.Once)
                        {
                            // noop
                        }
                        else if (p.ConditionType == ConditionType.OnFalse)
                        {
                            conditionsatisfied = !conditionsatisfied;
                        }
                    }
                    catch (Exception ex)
                    {
                        // a runtime error occured
                        p.ScriptErrors = ex.Message + "\n" + ex.StackTrace;
                        p.IsEnabled    = false;
                    }
                    //
                    sw.Stop();
                    //
                    callback(p, conditionsatisfied);
                    //
                    int delaynext = (int)(400 + (sw.ElapsedMilliseconds > 400 ? sw.ElapsedMilliseconds - 400 : 0));
                    if (delaynext > 500)
                    {
                        delaynext = 500;
                    }
                    //
                    Thread.Sleep(delaynext);
                }
                p.IsEvaluatingConditionBlock = false;
            }));

            //evaluatorthread.Priority = ThreadPriority.AboveNormal;
            evaluatorthread.Start();
        }
Пример #4
0
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                //
                try
                {
                    isConditionSatisfied = false;
                    //
                    if (program.Type.ToLower() != "wizard")
                    {
                        var result = program.EvaluateCondition();
                        if (result != null && result.Exception != null)
                        {
                            // runtime error occurred, script is being disabled
                            // so user can notice and fix it
                            List <ProgramError> error = new List <ProgramError>()
                            {
                                new ProgramError()
                                {
                                    CodeBlock    = "TC",
                                    Column       = 0,
                                    Line         = 0,
                                    ErrorNumber  = "-1",
                                    ErrorMessage = result.Exception.Message
                                }
                            };
                            program.ScriptErrors = JsonConvert.SerializeObject(error);
                            program.IsEnabled    = false;
                            RaiseProgramModuleEvent(
                                program,
                                "Runtime.Error",
                                "TC: " + result.Exception.Message.Replace(
                                    '\n',
                                    ' '
                                    )
                                );
                        }
                        else
                        {
                            isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                        }
                    }
                    else
                    {
                        // it is a Wizard Script
                        isConditionSatisfied = (program.Conditions.Count > 0);
                        for (int c = 0; c < program.Conditions.Count; c++)
                        {
                            bool res = VerifyProgramCondition(program.Conditions[c]);
                            isConditionSatisfied = (isConditionSatisfied && res);
                        }
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    List <ProgramError> error = new List <ProgramError>()
                    {
                        new ProgramError()
                        {
                            CodeBlock    = "TC",
                            Column       = 0,
                            Line         = 0,
                            ErrorNumber  = "-1",
                            ErrorMessage = ex.Message
                        }
                    };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled    = false;
                    RaiseProgramModuleEvent(program, "Runtime.Error", "TC: " + ex.Message.Replace('\n', ' '));
                }
                //
                callback(program, isConditionSatisfied);
                //
                Thread.Sleep(500);
            }
        }
Пример #5
0
        public void EvaluateProgramCondition(object evalArguments)
        {
            ProgramBlock program = (evalArguments as EvaluateProgramConditionArgs).Program;
            ConditionEvaluationCallback callback = (evalArguments as EvaluateProgramConditionArgs).Callback;
            //
            bool isConditionSatisfied = false;

            //
            while (isEngineRunning && program.IsEnabled)
            {
                if (program.IsRunning || !isEngineEnabled)
                {
                    Thread.Sleep(1000);
                    continue;
                }
                //
                try
                {
                    isConditionSatisfied = false;
                    //
                    if (program.Type.ToLower() != "wizard")
                    {
                        var result = program.EvaluateCondition();
                        if (result != null && result.Exception != null)
                        {
                            // runtime error occurred, script is being disabled
                            // so user can notice and fix it
                            List <ProgramError> error = new List <ProgramError>()
                            {
                                program.GetFormattedError(result.Exception, true)
                            };
                            program.ScriptErrors = JsonConvert.SerializeObject(error);
                            program.IsEnabled    = false;
                            RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + result.Exception.Message.Replace('\n', ' ').Replace('\r', ' '));
                        }
                        else
                        {
                            isConditionSatisfied = (result != null ? (bool)result.ReturnValue : false);
                        }
                    }
                    else
                    {
                        // it is a Wizard Script
                        isConditionSatisfied = (program.Conditions.Count > 0);
                        for (int c = 0; c < program.Conditions.Count; c++)
                        {
                            // check for OR logic operator
                            if (program.Conditions[c].ComparisonOperator == ComparisonOperator.LogicOrJoint)
                            {
                                if (isConditionSatisfied)
                                {
                                    break;
                                }
                                else
                                {
                                    isConditionSatisfied = (c < program.Conditions.Count - 1);
                                    continue;
                                }
                            }
                            //
                            bool res = false;
                            try
                            {
                                res = VerifyProgramCondition(program.Conditions[c]);
                            }
                            catch
                            {
                                // TODO: report/handle exception
                            }
                            isConditionSatisfied = (isConditionSatisfied && res);
                        }
                    }
                    //
                    bool lastResult = program.LastConditionEvaluationResult;
                    program.LastConditionEvaluationResult = isConditionSatisfied;
                    //
                    if (program.ConditionType == ConditionType.OnSwitchTrue)
                    {
                        isConditionSatisfied = (isConditionSatisfied == true && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnSwitchFalse)
                    {
                        isConditionSatisfied = (isConditionSatisfied == false && isConditionSatisfied != lastResult);
                    }
                    else if (program.ConditionType == ConditionType.OnTrue || program.ConditionType == ConditionType.Once)
                    {
                        // noop
                    }
                    else if (program.ConditionType == ConditionType.OnFalse)
                    {
                        isConditionSatisfied = !isConditionSatisfied;
                    }
                }
                catch (Exception ex)
                {
                    // a runtime error occured
                    List <ProgramError> error = new List <ProgramError>()
                    {
                        program.GetFormattedError(ex, true)
                    };
                    program.ScriptErrors = JsonConvert.SerializeObject(error);
                    program.IsEnabled    = false;
                    RaiseProgramModuleEvent(program, Properties.RUNTIME_ERROR, "TC: " + ex.Message.Replace('\n', ' ').Replace('\r', ' '));
                }
                //
                callback(program, isConditionSatisfied);
                //
                Thread.Sleep(500);
            }
        }