int eventqueue(Hashtable data, FunctionExit port) { int returnValue = 0; EventPoint l = new EventPoint(); l.data = data; l.port = port; string eventType = "raise"; if (l.data.Contains("systemEvent")) { eventType = l.data["systemEvent"].ToString(); l.data.Remove("systemEvent"); } int pid = 0; if (l.data.Contains("pid")) { pid = (int)l.data["pid"]; l.pid = pid; l.data.Remove("pid"); } int id = 0; if (l.data.Contains("gid")) { id = (int)l.data["gid"]; l.gid = id; l.data.Remove("gid"); } lock (m_RaisedEvents) { if (eventType == "raise") { int eid = m_rand.Next(1, Int32.MaxValue); while (m_RaisedEvents.ContainsKey(eid)) { eid = m_rand.Next(1, Int32.MaxValue); } m_RaisedEvents[eid] = l; returnValue = eid; if (l.port == null) { m_EventResults[eid] = new Queue(); } foreach (int lid in m_EventListeners.Keys) { if (IsRespectiveListener(l, m_EventListeners[lid].data)) { Hashtable h = Utils.Clone(l.data); h.Add("systemEventId", eid); m_EventListeners[lid].port(h); } } if (m_Runners.ContainsKey(pid)) { lock (m_Runners[pid]) { Monitor.PulseAll(m_Runners[pid]); } } } else if (eventType == "query") { Hashtable response = new Hashtable(); int i = 0; foreach (int eid in m_RaisedEvents.Keys) { if (m_RaisedEvents[eid].data.ContainsKey("system")) { if (m_RaisedEvents[eid].data["system"] as String == "EventTimeout") { if (DateTime.FromBinary(Convert.ToInt64(m_RaisedEvents[eid].data["value"])).CompareTo(DateTime.Now) <= 0) { // TODO: remove key from m_RaisedEvents and m_EventResults tables } } } if (IsRespectiveListener(m_RaisedEvents[eid], l.data)) { response.Add(i++, eid); } } l.port(response); } else if (eventType == "fetch") { Hashtable response = new Hashtable(); bool success = true; if (l.data.Contains("systemEventId")) { int eventId = Convert.ToInt32(l.data["systemEventId"]); if (!m_RaisedEvents.ContainsKey(eventId)) { success = false; } else { response = Utils.Clone(m_RaisedEvents[eventId].data); } } else { success = false; } if (!success) { response.Add("success", false); } l.port(response); } else if (eventType == "answer") { Hashtable response = new Hashtable(); bool success = true; if (l.data.Contains("systemEventId")) { int eventId = Convert.ToInt32(l.data["systemEventId"]); l.data.Remove("systemEventId"); if (!m_RaisedEvents.ContainsKey(eventId)) { success = false; } else { bool close = false; if (l.data.Contains("systemEventClose")) { close = Convert.ToBoolean(l.data["systemEventClose"]); } if (m_RaisedEvents[eventId].port != null) { m_RaisedEvents[eventId].port(l.data); } else { m_EventResults[eventId].Enqueue(l.data); lock (m_EventResults[eventId]) { Monitor.PulseAll(m_EventResults[eventId]); } } if (close) { if (m_RaisedEvents[eventId].port != null) { m_RaisedEvents.Remove(eventId); } else { m_RaisedEvents[eventId].data.Clear(); m_RaisedEvents[eventId].data.Add("system", "EventTimeout"); m_RaisedEvents[eventId].data.Add("value", DateTime.Now.AddMinutes(5).ToBinary()); } } } } else { success = false; } response.Add("success", success); l.port(response); } else if (eventType == "close") { Hashtable response = new Hashtable(); bool success = true; if (l.data.Contains("systemEventId")) { int eventId = Convert.ToInt32(l.data["systemEventId"]); if (!m_RaisedEvents.ContainsKey(eventId)) { success = false; } else { if (m_RaisedEvents[eventId].port != null) { m_RaisedEvents.Remove(eventId); } else { m_RaisedEvents[eventId].data.Clear(); m_RaisedEvents[eventId].data.Add("system", "EventTimeout"); m_RaisedEvents[eventId].data.Add("value", DateTime.Now.AddMinutes(5).ToBinary()); } } } else if (l.data.Contains("systemListenerId")) { int listenerId = Convert.ToInt32(l.data["systemListenerId"]); if (!m_EventListeners.ContainsKey(listenerId)) { success = false; } else { m_EventListeners.Remove(listenerId); } } else { success = false; } response.Add("success", success); l.port(response); } else if (eventType == "listen") { int lid = m_rand.Next(1, Int32.MaxValue); while (m_EventListeners.ContainsKey(lid)) { lid = m_rand.Next(1, Int32.MaxValue); } m_EventListeners[lid] = l; returnValue = lid; foreach (int eid in m_RaisedEvents.Keys) { if (IsRespectiveListener(m_RaisedEvents[eid], l.data)) { Hashtable h = Utils.Clone(m_RaisedEvents[eid].data); h.Add("systemEventId", eid); l.port(h); } } } else if (eventType == "systemLoad") // internal, direct proccessing { if (l.data.ContainsKey("assembly")) { l.data.Remove("assembly"); } if (l.data.Contains("projectName")) { string projectName = Convert.ToString(l.data["projectName"]); int projectId; if (!m_ProjectsByName.ContainsKey(projectName)) { projectId = LoadProject(projectName); } else { projectId = m_ProjectsByName[projectName]; } lock (m_ProjectsByID) { if (m_Builds.ContainsKey(projectId)) { l.data.Add("assembly", m_Builds[projectId].Assembly); } } } } } Console.WriteLine("Node raised an event"); return(returnValue); }