Exemple #1
0
        void ReleaseDesignerOutlets()
        {
            if (DefinitionDescription != null)
            {
                DefinitionDescription.Dispose();
                DefinitionDescription = null;
            }

            if (DefinitionTitle != null)
            {
                DefinitionTitle.Dispose();
                DefinitionTitle = null;
            }
        }
        /// <summary>
        /// The add include to collection.
        /// </summary>
        /// <param name="fileName">
        /// The file name.
        /// </param>
        /// <param name="itemName">
        /// The item name.
        /// </param>
        /// <param name="expression">
        /// The expression.
        /// </param>
        /// <param name="parent">
        /// The parent.
        /// </param>
        private void AddIncludeToCollection(string fileName, string itemName, string expression, DefinitionDescription parent)
        {
            // check if I already have the definition in the collection
            lock (this.processCollection)
            {
                DefinitionDescription basicProgramDescription = null;
                if (this.processCollection.ContainsKey(fileName, itemName, typeof(BasicProgramDescription)))
                {
                    basicProgramDescription = this.processCollection[fileName, itemName, typeof(BasicProgramDescription)];
                }

                if (basicProgramDescription == null)
                {
                    basicProgramDescription = new BasicProgramDescription(fileName, itemName);
                    BasicProgramDescription.IsInclude = true;
                    this.processCollection.Add(basicProgramDescription);
                }

                this.AddBasicProgramToCollection(
                    basicProgramDescription,
                    new ProcessLoadState { Expression = expression, HookPoint = "INCLUDE", ParentDefinitionDescription = parent });
            }
        }
 /// <summary>
 /// The add expression to collection.
 /// </summary>
 /// <param name="source">
 /// The source.
 /// </param>
 /// <param name="hookType">
 /// The hook type.
 /// </param>
 /// <param name="description">
 /// The description.
 /// </param>
 /// <param name="processDescription">
 /// The process description.
 /// </param>
 /// <param name="expression">
 /// The expression.
 /// </param>
 /// <param name="sysid">
 /// The sysid.
 /// </param>
 private void AddExpressionToCollection(
     SourceDefinition source,
     SourceDefinition hookType,
     string description,
     DefinitionDescription processDescription,
     string expression,
     string sysid = "")
 {
     JobManager.RunInDispatcherThread(
         DebugWindowManager.DebugConsoleWindow.Dispatcher,
         DispatcherPriority.Normal,
         delegate
             {
                 try
                 {
                     switch (source)
                     {
                         case SourceDefinition.Field:
                             this.AddItemToCollection(
                                 processDescription.DictionaryExpressions,
                                 new SBExpression(processDescription.FileName, expression, hookType, sysid)
                                     {
                                         Description =
                                             description
                                     });
                             break;
                         case SourceDefinition.Screen:
                             /*
                             if (hookType == SourceDefinition.Process)
                             {
                                 //AddItemToCollection(processDescription.ProcessCollection, );
                                 this.AddProcessToCollection(
                                     description,
                                     processDescription,
                                     new SBExpression(processDescription.FileName, expression, hookType, sysid, expression)
                                         {
                                             Description
                                                 =
                                                 description
                                         });
                             }
                             else
                             {
     */
                             this.AddItemToCollection(
                                 processDescription.ScreenExpressions,
                                 new SBExpression(processDescription.FileName, expression, hookType, sysid)
                                     {
                                         Description =
                                             description
                                     });
                             /*
                             }
     */
                             break;
                         case SourceDefinition.Menu:
                             this.AddProcessToCollection(
                                 description,
                                 processDescription,
                                 new SBExpression(processDescription.FileName, expression, hookType, sysid, expression)
                                     {
                                         Description
                                             =
                                             description
                                     });
                             break;
                         case SourceDefinition.Paragraph:
                             this.AddItemToCollection(
                                 processDescription.Expressions,
                                 new SBExpression(processDescription.FileName, expression, hookType, sysid)
                                     {
                                         Description =
                                             description
                                     });
                             break;
                         case SourceDefinition.Unknown:
                             this.AddItemToCollection(
                                 processDescription.Expressions,
                                 new SBExpression(processDescription.FileName, expression, hookType, sysid)
                                     {
                                         Description =
                                             description
                                     });
                             break;
                     }
                 }
                 catch (Exception exception)
                 {
                     CustomLogger.LogException(exception, "Problem adding expression to the collection.");
                 }
             });
 }
        /// <summary>
        /// The add basic program to collection.
        /// </summary>
        /// <param name="basicProgramDescription">
        /// The basic program description.
        /// </param>
        /// <param name="processLoadState">
        /// The process load state.
        /// </param>
        private void AddBasicProgramToCollection(DefinitionDescription basicProgramDescription, ProcessLoadState processLoadState = null)
        {
            if (DebugWindowManager.DebugConsoleWindow == null)
            {
                return;
            }

            if (basicProgramDescription == null)
            {
                CustomLogger.LogError(() => "A null basic program description was passed to AddBasicProgramToCollection.");
                return;
            }

            JobManager.RunInDispatcherThread(
                DebugWindowManager.DebugConsoleWindow.Dispatcher,
                DispatcherPriority.Normal,
                delegate
                    {
                        try
                        {
                            if (processLoadState == null)
                            {
                                CustomLogger.LogError(() => "A nullprocessLoadState was passed to AddBasicProgramToCollection.");
                                return;
                            }

                            if (processLoadState.ParentDefinitionDescription == null)
                            {
                                this.Definition = basicProgramDescription;
                                this.ProcessStack.Clear();
                                this.ProcessStack.Push(this.Definition);
                            }
                            else
                            {
                                this.AddItemToCollection(
                                    processLoadState.ParentDefinitionDescription.ProcessCollection,
                                    new ProcessCall
                                        {
                                            Description = processLoadState.HookPoint,
                                            ProcessDescription = basicProgramDescription
                                        });
                            }
                        }
                        catch (Exception ex)
                        {
                            CustomLogger.LogException(
                                ex,
                                "There was a problem adding " + basicProgramDescription.Name + " to the collection.");
                        }
                    });
        }
        /// <summary>
        /// The load screen.
        /// </summary>
        /// <param name="screenName">
        /// The screen name.
        /// </param>
        /// <param name="fileName">
        /// The file name.
        /// </param>
        /// <param name="parent">
        /// The parent.
        /// </param>
        /// <param name="hookPoint">
        /// The hook point.
        /// </param>
        internal void LoadScreen(string screenName, string fileName, DefinitionDescription parent = null, string hookPoint = "")
        {
            JobManager.RunInUIThread(
                DispatcherPriority.Input,
                delegate
                    {
                        if (string.IsNullOrEmpty(screenName) || string.IsNullOrEmpty(fileName))
                        {
                            return;
                        }

                        this.SetIsLoading(1);
                        SBFile.ReadDictionaryItem(
                            fileName,
                            screenName,
                            new ScreenDefinitionLoadState
                                {
                                    FileName = fileName,
                                    ParentDefinitionDescription = parent,
                                    HookPoint = hookPoint
                                },
                            this.ReadProcessCompleted);
                    });
        }
        /// <summary>
        /// Loads the definition from expression.
        /// </summary>
        /// <param name="source">
        /// Where the expression is being called from.
        /// </param>
        /// <param name="hookType">
        /// If this is a process hook point or expression hook point.
        /// </param>
        /// <param name="expression">
        /// The original expression that the definition name was derrived from.
        /// </param>
        /// <param name="parent">
        /// Parent <see cref="DefinitionDescription"/>, if this is null then it will be the root of the tree.
        /// </param>
        /// <param name="hookPoint">
        /// The name of the definition slot where the definition was found.
        /// </param>
        /// <param name="sysid">
        /// The system id to use otherwise the current system id will be used.
        /// </param>
        internal void LoadProcessFromExpression(
            SourceDefinition source,
            SourceDefinition hookType,
            string expression,
            DefinitionDescription parent = null,
            string hookPoint = "",
            string sysid = "")
        {
            if (string.IsNullOrEmpty(expression))
            {
                // there is no expression so no need to try load it.
                return;
            }

            if (expression.StartsWith("P.CALL.PROCESS"))
            {
                // this is specific to American Auto Shield. The have a process used to call other processes so we can just remove it.
                expression = expression.Substring(15);
            }

            // Check to see if it is a constant, if so just add it to the collection.
            if (SBExpression.IsConstantValueExpression(expression))
            {
                this.AddExpressionToCollection(source, hookType, hookPoint, parent, expression);
                return;
            }

            var colonPos = expression.IndexOf(":", StringComparison.Ordinal);
            if (colonPos != 1)
            {
                // SB expression that have an identified, i.e. B: D: all have a single character then a ':'
                colonPos = 0;
            }

            // a field definition has no process hooks they are all expressions, etc. int help.
            if (source != SourceDefinition.Paragraph
                && (colonPos > 0 || source == SourceDefinition.Field || source == SourceDefinition.Expression))
            {
                this.AddExpressionToCollection(source, hookType, hookPoint, parent, expression);
                return;
            }

            string callType;
            var pName = GetProcessName(expression, out callType);
            if (!string.IsNullOrEmpty(pName))
            {
                switch (callType)
                {
                    case "C":
                        this.LoadProcess(pName, source, hookType, parent, expression, hookPoint, sysid);
                        break;
                    case "B":
                        this.LoadBasicProgramFromExpression(pName, parent, hookPoint);
                        break;
                    case "M":
                        break;
                    case "D":
                        this.AddExpressionToCollection(source, hookType, hookPoint, parent, expression);
                        break;
                    case "V":
                        this.AddExpressionToCollection(source, hookType, hookPoint, parent, expression);
                        break;
                    default:
                        this.LoadProcess(pName, source, hookType, parent, expression, hookPoint, sysid);
                        break;
                }
            }
        }
        /// <summary>
        /// Loads the definition from xxPROCESS.
        /// </summary>
        /// <param name="pName">
        /// Name of the definition.
        /// </param>
        /// <param name="slotType"></param>
        /// <param name="parent">
        /// Parent <see cref="DefinitionDescription"/>, if this is null then it will be the root of the tree.
        /// </param>
        /// <param name="expression">
        /// The original expression that the definition name was derrived from.
        /// </param>
        /// <param name="hookPoint">
        /// The name of the definition slot where the definition was found.
        /// </param>
        /// <param name="sysid">
        /// The system id to use otherwise the current system id will be used.
        /// </param>
        /// <param name="source"></param>
        internal void LoadProcess(
            string pName,
            SourceDefinition source,
            SourceDefinition slotType,
            DefinitionDescription parent = null,
            string expression = "",
            string hookPoint = "",
            string sysid = "")
        {
            if (SBExpression.IsStandardSBExpression(expression))
            {
                // standard SB expression elements and therefore no need to try read the process, just add the element
                this.AddExpressionToCollection(parent, hookPoint, expression);
                return;
            }

            if (string.IsNullOrEmpty(expression))
            {
                expression = pName;
            }

            JobManager.RunInUIThread(
                DispatcherPriority.Input,
                delegate
                    {
                        var processFile = sysid;
                        if (string.IsNullOrEmpty(processFile))
                        {
                            processFile = SBPlusClient.Current.SystemId;
                        }

                        // read definition record from current xxProcess
                        processFile += "PROCESS";
                        // check if I already have the definition in the collection
                        lock (this.processCollection)
                        {
                            if (this.processCollection.ContainsKey(processFile, pName))
                            {
                                this.SetIsLoading(1);
                                this.AddProcessToCollection(pName, parent, this.processCollection[pName]);
                                this.SetIsLoading(-1);
                                return;
                            }
                        }

                        this.SetIsLoading(1);
                        SBFile.Read(
                            processFile,
                            pName,
                            this.ReadProcessCompleted,
                            new ProcessLoadState { HookPoint = hookPoint, ParentDefinitionDescription = parent, Expression = expression, Source = source, SlotType = slotType, SysId = sysid });
                    });
        }
        /// <summary>
        /// The load basic program from expression.
        /// </summary>
        /// <param name="expression">
        /// The expression.
        /// </param>
        /// <param name="parent">
        /// The parent.
        /// </param>
        /// <param name="hookPoint">
        /// The hook point.
        /// </param>
        internal void LoadBasicProgramFromExpression(string expression, DefinitionDescription parent = null, string hookPoint = "")
        {
            string callType;
            var programName = ProcessAnalysisViewModel.GetProcessName(expression, out callType);

            if (programName.IndexOf("(") > 0)
            {
                programName = programName.Substring(0, expression.IndexOf("(") - 1);
            }

            if (string.IsNullOrEmpty(programName))
            {
                return;
            }

            this.LoadBasicProgram(programName, parent, expression, hookPoint);
        }
 /// <summary>
 /// The add expression to collection.
 /// </summary>
 /// <param name="parent">
 /// The parent.
 /// </param>
 /// <param name="hookPoint">
 /// The hook point.
 /// </param>
 /// <param name="expression">
 /// The expression.
 /// </param>
 /// <param name="sysId">
 /// The sys id.
 /// </param>
 internal void AddExpressionToCollection(DefinitionDescription parent, string hookPoint, string expression, string sysId = "")
 {
     // standard SB expression elements and therefore no need to try read the process, just add the element
     // var processDescription = new DefinitionDescription(string.Empty, expression, string.Empty) { Description = hookPoint };
     var sbExpression = new SBExpression(parent.FileName, expression, SourceDefinition.Expression, sysId);
     // this.AddProcessToCollection(hookPoint, parent, processDescription);
     this.AddProcessToCollection(hookPoint, parent, sbExpression);
 }
        /// <summary>
        /// The load basic program.
        /// </summary>
        /// <param name="programName">
        /// The program name.
        /// </param>
        /// <param name="parent">
        /// The parent.
        /// </param>
        /// <param name="expression">
        /// The expression.
        /// </param>
        /// <param name="hookPoint">
        /// The hook point.
        /// </param>
        private void LoadBasicProgram(
            string programName,
            DefinitionDescription parent = null,
            string expression = "",
            string hookPoint = "")
        {
            JobManager.RunInUIThread(
                DispatcherPriority.Input,
                delegate
                    {
                        // check if I already have the definition in the collection
                        lock (this.processCollection)
                        {
                            if (this.processCollection.ContainsKey(string.Empty, programName, typeof(BasicProgramDescription)))
                            {
                                // Debug.WriteLine("[ProcessAnalysisViewModel.LoadBasicProgram(320)] Loaded " + programName + " from cache");
                                this.AddBasicProgramToCollection(
                                    this.processCollection[programName] as BasicProgramDescription,
                                    new ProcessLoadState
                                        {
                                            Expression = expression,
                                            HookPoint = hookPoint,
                                            ParentDefinitionDescription = parent
                                        });
                                return;
                            }

                            // not in cache so add it.
                            // Debug.WriteLine("[ProcessAnalysisViewModel.LoadBasicProgram(328)] Added " + programName + " to cache.");
                            var basicProgramDescription = new BasicProgramDescription(string.Empty, programName);
                            this.processCollection.Add(basicProgramDescription);
                        }

                        this.SetIsLoading(1);
                        SBFile.Read(
                            "VOC",
                            programName,
                            this.ReadBasicProgramVocPointerCompleted,
                            new ProcessLoadState { HookPoint = hookPoint, ParentDefinitionDescription = parent, Expression = expression });
                    });
        }
        /// <summary>
        /// This method will parse out the definition and figure out the type of definition.
        /// </summary>
        /// <param name="processFileName">
        /// The name of the file that contains the process.
        /// </param>
        /// <param name="pName">
        /// The name of the definition.
        /// </param>
        /// <param name="defn">
        /// The definition description.
        /// </param>
        /// <param name="processLoadState">
        /// The information about the definition definition passed from the calling routine.
        /// </param>
        /// <returns>
        /// The <see cref="DefinitionDescription"/>.
        /// </returns>
        private DefinitionDescription CreateProcessDescription(
            string processFileName,
            string pName,
            SBString defn,
            ProcessLoadState processLoadState)
        {
            DefinitionDescription processDescription;
            if (defn == null)
            {
                if (processLoadState.Source == SourceDefinition.Button)
                {
            /*
                    processDescription = new ButtonDefinitionDescription()
                                             {
                                                 Description = processLoadState.HookPoint,
                                                 pName,
                                                 Source
                                             };
            */
                    processDescription = new ButtonDefinitionDescription(
                        processFileName,
                        pName,
                        SourceDefinition.Process,
                        processLoadState.Expression);
                }
                else
                {
                    processDescription = new DefinitionDescription(
                                                processFileName,
                                                pName,
                                                SourceDefinition.Process,
                                                processLoadState.Expression)
                                                {
                                                    IsError = true
                                                };

                }
                return processDescription;
            }

            switch (defn.Extract(1).Value)
            {
                case "I":
                    processDescription = new InputDefinitionDescription(processFileName, pName, processLoadState.Expression, defn);
                    break;
                case "O":
                    processDescription = new OutputDefinitionDescription(processFileName, pName, processLoadState.Expression, defn);
                    break;
                case "P":
                    processDescription = this.CreateParagraphDescription(processFileName, pName, processLoadState.Expression, defn);
                    break;
                case "SCREEN":
                    processDescription = new ScreenDefintion(processFileName, pName, string.Empty, defn);
                    break;
                case "F":
                    processDescription = new FileUpdateDefinitionDescription(processFileName, pName, string.Empty, defn);
                    break;
                case "M":
                    processDescription = new MenuDefinitionDescription(processFileName, pName, string.Empty, defn);
                    break;
                case "S":
                    processDescription = new SelectionProcessDescription(processFileName, pName, SourceDefinition.Process, processLoadState.SysId, defn);
                    break;
                default:
                    processDescription = new DefinitionDescription(
                        processFileName,
                        pName,
                        SourceDefinition.Process,
                        processLoadState.Expression);
                    break;
            }

            return processDescription;
        }
        /// <summary>
        /// The add process to collection.
        /// </summary>
        /// <param name="description">
        /// The description.
        /// </param>
        /// <param name="parentDefinitionDescription">
        /// The parent definition description.
        /// </param>
        /// <param name="processDescription">
        /// The process description.
        /// </param>
        /// <param name="source">Where is the process being called from.</param>
        private void AddProcessToCollection(
            string description,
            DefinitionDescription parentDefinitionDescription,
            DefinitionDescription processDescription,
            SourceDefinition source = SourceDefinition.Unknown)
        {
            JobManager.RunInDispatcherThread(
                DebugWindowManager.DebugConsoleWindow.Dispatcher,
                DispatcherPriority.Normal,
                delegate
                    {
                        if (parentDefinitionDescription == null)
                        {
                            this.Definition = processDescription;
                            this.ResetAnalysis();
                            this.ProcessStack.Push(this.Definition);
                        }
                        else
                        {
                            switch (source)
                            {
                                case SourceDefinition.Screen:
                                    if (processDescription is SBExpression)
                                    {
                                        this.AddItemToCollection(parentDefinitionDescription.ScreenExpressions, processDescription as SBExpression);
                                    }
                                    else
                                    {
                                        this.AddItemToCollection(
                                            parentDefinitionDescription.ProcessCollection,
                                            new ProcessCall { Description = description, ProcessDescription = processDescription });
                                    }
                                    break;
                                case SourceDefinition.Button:
                                    //this.AddItemToCollection(description, processDescription, parentDefinitionDescription.ProcessCollection);
                                    this.AddItemToCollection(
                                        parentDefinitionDescription.ProcessCollection,
                                        new ProcessCall { Description = description, ProcessDescription = processDescription });

                                    break;
                                default:
                                    this.AddItemToCollection(
                                        parentDefinitionDescription.ProcessCollection,
                                        new ProcessCall { Description = description, ProcessDescription = processDescription });
                                    break;
                            }
                        }
                    });
        }
 /// <summary>
 /// The push process.
 /// </summary>
 /// <param name="stack">
 /// The stack.
 /// </param>
 /// <param name="definition">
 /// The definition.
 /// </param>
 private static void PushProcess(ProcessStack stack, DefinitionDescription definition)
 {
     // check if there is a definition on the stack, if there is add it to the list of children, not just push it.
     if (stack.Count == 0)
     {
         stack.Push(definition);
     }
     else
     {
         var lowestParent = FindLowestProcess(stack.Peek());
         if (lowestParent != null)
         {
             lowestParent.ChildProcesses.Push(definition);
         }
     }
 }
        /// <summary>
        /// The find lowest process parent.
        /// </summary>
        /// <param name="definition">
        /// The definition.
        /// </param>
        /// <returns>
        /// The <see cref="DefinitionDescription"/>.
        /// </returns>
        private static DefinitionDescription FindLowestProcessParent(DefinitionDescription definition)
        {
            // The zero is to prevent an infinite loop - it should never happen.
            if (definition.ChildProcesses.Count == 0)
            {
                return definition;
            }

            if (definition.ChildProcesses.Count == 1)
            {
                // I need to look if the child has a definition in it's children.
                var childProcessDescription = definition.ChildProcesses.Peek();
                if (childProcessDescription.ChildProcesses.Count == 0)
                {
                    return definition;
                }
            }

            return FindLowestProcessParent(definition.ChildProcesses.Peek());
        }
        /// <summary>
        /// The find lowest process.
        /// </summary>
        /// <param name="definition">
        /// The definition.
        /// </param>
        /// <returns>
        /// The <see cref="DefinitionDescription"/>.
        /// </returns>
        private static DefinitionDescription FindLowestProcess(DefinitionDescription definition)
        {
            if (definition.ChildProcesses.Count == 0)
            {
                return definition;
            }

            return FindLowestProcess(definition.ChildProcesses.Peek());
        }
        /// <summary>
        /// The do update process stack.
        /// </summary>
        /// <param name="add">
        /// The add.
        /// </param>
        /// <param name="processName">
        /// The process name.
        /// </param>
        /// <param name="actionTime">
        /// The action time.
        /// </param>
        /// <param name="serverActionTime">
        /// The server action time.
        /// </param>
        private static void DoUpdateProcessStack(bool add, string processName, DateTime actionTime, int serverActionTime)
        {
            try
            {
                Debug.WriteLine("[DebugViewModel.DoUpdateProcessStack(837)] " + add + ", " + processName);
                lock (Instance.ProcessStack)
                {
                    if (add)
                    {
                        var historyProcess = new DefinitionDescription(string.Empty, processName)
                                                 {
                                                     StartTime = actionTime, 
                                                     ServerStartMilliseconds =
                                                         serverActionTime
                                                 };
                        try
                        {
                            PushProcess(
                                Instance.ProcessStack, 
                                new DefinitionDescription(string.Empty, processName)
                                    {
                                        HistoryProcessDescription = historyProcess, 
                                        StartTime = actionTime, 
                                        ServerStartMilliseconds = serverActionTime
                                    });
                        }
                        catch (Exception exception)
                        {
                            SBPlusClient.LogError("Exception caught adding " + processName + " to ProcessStack.", exception);
                        }

                        lock (Instance.ProcessHistoryStack)
                        {
                            try
                            {
                                if (Instance.CurrentProcess == null)
                                {
                                    Instance.ProcessHistoryStack.Push(historyProcess);
                                }
                                else
                                {
                                    Instance.CurrentProcess.ChildProcesses.Push(historyProcess);
                                }

                                Instance.CurrentProcess = historyProcess;
                            }
                            catch (Exception exception)
                            {
                                SBPlusClient.LogError("Exception caught adding " + processName + " to ProcessHistoryStack.", exception);
                            }
                        }
                    }
                    else
                    {
                        try
                        {
                            if (Instance.ProcessStack.Count == 0)
                            {
                                return;
                            }

                            PopProcess(Instance.ProcessStack, actionTime, serverActionTime);
                        }
                        catch (Exception exception)
                        {
                            CustomLogger.LogException(exception, "Exception caught adding " + processName + " to ProcessHistoryStack.");
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                SBPlusClient.LogError("Exception caught.", exception);
            }
        }