Esempio n. 1
0
 private OSCManager()
 {
     _rootNode = new OSCTreeNode()
     {
         NodeName = "root"
     };
     _removeAddresses = new List <string>();
 }
Esempio n. 2
0
        void ListenToAddressInternal(string address, OSCMessageHandler handler)
        {
            OSCTreeNode leaf = GetLeaf(address);

            if (!leaf.Handlers.Contains(handler))
            {
                leaf.Handlers.Add(handler);
            }
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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);
        }