/// <summary> /// Creates and configures the shared variables specified in the provided XML document for the specified blackboard /// </summary> /// <param name="doc">XML document which contains shared variables initialization data</param> /// <param name="blackboard">Blackboard object in which the shared variables will be configured</param> private static void SetupSharedVariables(XmlDocument doc, Blackboard blackboard) { if ((doc == null) || (blackboard == null)) throw new ArgumentNullException(); if (blackboard.virtualModule == null) throw new Exception("Uninitialized blackboard"); int i, j; ILogWriter log; XmlDocument tmpDoc; XmlNode node; XmlNodeList xmlVarList; XmlNodeList xmlWriterModuleList; SharedVariable shVar; List<string> writers; string shVarName; string shVarType; string shVarValue; bool shVarIsArray; int bracketPos; log = blackboard.log; tmpDoc = new XmlDocument(); if (doc.GetElementsByTagName("sharedVariables").Count < 1) { log.WriteLine(1, "No shared variables was defined in XML file."); return; } tmpDoc.LoadXml(doc.GetElementsByTagName("sharedVariables")[0].OuterXml); #region Load of shared variables // Load of shared variables log.WriteLine(1, "Reading shared variables"); xmlVarList = tmpDoc.GetElementsByTagName("var"); for (i = 0; i < xmlVarList.Count; ++i) { #region Get variable Name node = xmlVarList[i]; if ((node == null) || (node.Name != "var") || (node.Attributes["name"] == null)) continue; shVarName = node.Attributes["name"].InnerText; shVarType = (node.Attributes["type"] != null) ? node.Attributes["type"].InnerText : "var"; if (String.IsNullOrEmpty(shVarType) || !SharedVariable.RxVarTypeValidator.IsMatch(shVarType)) shVarType = "var"; bracketPos = shVarType.IndexOf("["); if (shVarIsArray = (bracketPos != -1)) shVarType = shVarType.Remove(bracketPos); if (blackboard.VirtualModule.SharedVariables.Contains(shVarName)) { log.WriteLine(2, "Error loading shared variable " + shVarName + ". Variable already exists."); continue; } #endregion #region Get variable initial value shVarValue = ""; if (node.Attributes["value"] != null) { shVarValue = node.Attributes["value"].Value; } else if (node.Attributes["fromFile"] != null) { shVarValue = node.Attributes["fromFile"].Value; if (File.Exists(shVarValue)) { try { shVarValue = File.ReadAllText(shVarValue); } catch { log.WriteLine(2, "Error loading variable content from file " + shVarValue + " for the shared variable " + shVarName + ". Variable was set to null"); shVarValue = ""; } } } #endregion #region Get list of modules with write permission writers = new List<string>(); tmpDoc = new XmlDocument(); tmpDoc.LoadXml(node.OuterXml); xmlWriterModuleList = tmpDoc.GetElementsByTagName("writers"); if (xmlWriterModuleList.Count == 1) { writers.Add(blackboard.VirtualModule.Name); tmpDoc = new XmlDocument(); tmpDoc.LoadXml(xmlWriterModuleList[0].OuterXml); xmlWriterModuleList = tmpDoc.GetElementsByTagName("writer"); for (j = 0; j < xmlWriterModuleList.Count; ++j) { node = xmlWriterModuleList[j]; if (node.InnerText == "*") { writers.Clear(); writers.Add("*"); break; } if (!blackboard.modules.Contains(node.InnerText)) continue; else writers.Add(node.InnerText); /* if (!writers.Contains(node.InnerText)) writers.Add(node.InnerText); */ } } else writers.Add("*"); #endregion #region Create and add the shared variable shVar = new SharedVariable(blackboard.VirtualModule, shVarType, shVarName, shVarIsArray, -1); //shVar.Data = shVarValue; shVar.WriteStringData(blackboard.VirtualModule, shVarType, -1, shVarValue); writers.Sort(); shVar.AllowedWriters = writers; blackboard.VirtualModule.SharedVariables.Add(shVar); log.WriteLine(4, "Added shared variable " + shVarType +" "+ shVarName); #endregion } #endregion }