private OSCManager() { _rootNode = new OSCTreeNode() { NodeName = "root" }; _removeAddresses = new List <string>(); }
void ListenToAddressInternal(string address, OSCMessageHandler handler) { OSCTreeNode leaf = GetLeaf(address); if (!leaf.Handlers.Contains(handler)) { leaf.Handlers.Add(handler); } }
void UpdateInternal() { if (s_PendingMessages.Count > 0) { // Get the mail s_PendingMessageLock.WaitOne(); OSCMessage[] messages = s_PendingMessages.ToArray(); s_PendingMessages.Clear(); s_PendingMessageLock.ReleaseMutex(); int breakIndex = -1; for (int i = 0; i < messages.Length; i++) { OSCMessage msg = messages[i]; OSCTreeNode node = GetLeaf(msg.Address, false); if (node != null) { foreach (OSCMessageHandler handler in node.Handlers) { if (!handler(msg)) { breakIndex = i + 1; } } } if (breakIndex >= 0) { break; } } if (breakIndex >= 0) { s_PendingMessageLock.WaitOne(); for (int i = messages.Length - 1; i >= breakIndex; i--) { s_PendingMessages.Insert(0, messages[i]); } s_PendingMessageLock.ReleaseMutex(); } } foreach (string remove in _removeAddresses) { OSCTreeNode node = GetLeaf(remove, false); if (node != null) { node.Handlers.Clear(); } } _removeAddresses.Clear(); }
OSCTreeNode GetLeaf(string address, bool buildTree = true) { string[] pieces = address.ToLower().Split('/'); if (pieces.Length < 1) { return(null); } OSCTreeNode treeCursor = _rootNode; int firstPiece = (pieces[0] == "root") ? 1 : 0; for (int i = firstPiece; i < pieces.Length; i++) { OSCTreeNode nextNode = null; if (treeCursor.Children != null) { foreach (OSCTreeNode child in treeCursor.Children) { if (child.NodeName == pieces[i]) { nextNode = child; break; } } } if (nextNode == null) { if (!buildTree) { return(null); } nextNode = new OSCTreeNode() { NodeName = pieces[i], Handlers = new List <OSCMessageHandler>(), Parent = treeCursor }; if (treeCursor.Children == null) { treeCursor.Children = new List <OSCTreeNode>(); } treeCursor.Children.Add(nextNode); } treeCursor = nextNode; } return(treeCursor); }