Beispiel #1
0
        void TaskComplete(object sender, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= TaskComplete;

            // I should raise the event with some eventargs saying which node was dead
            SendQueryEventArgs args = (SendQueryEventArgs)e;

            if (args.TimedOut)
            {
                // If the node didn't respond and it's no longer in our bucket,
                // we need to send a ping to the oldest node in the bucket
                // Otherwise if we have a non-responder and it's still there, replace it!
                int index = bucket.Nodes.IndexOf(((SendQueryTask)e.Task).Target);
                if (index < 0)
                {
                    SendPingToOldest();
                }
                else
                {
                    bucket.Nodes[index] = newNode;
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
            else
            {
                SendPingToOldest();
            }
        }
        private void TaskComplete(object sender, TaskCompleteEventArgs eventArgs)
        {
            _task.Completed -= TaskComplete;

            var sendQueryEventArgs = (SendQueryEventArgs)eventArgs;

            if (sendQueryEventArgs.TimedOut)
            {
                _bucket.SortBySeen();
                var index = _bucket.Nodes.IndexOf(_node);

                if (index == -1 || (++index < _bucket.Nodes.Count))
                {
                    QueryNode(_bucket.Nodes[0]);
                }
                else
                {
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
            else
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #3
0
        private static void FindNodeComplete(object sender, TaskCompleteEventArgs e)
        {
            SendQueryEventArgs args = (SendQueryEventArgs)e;

            lock (engine)
                activities--;
            if (!args.TimedOut)
            {
                logAdd("Visited");
                if (find_queue.Count < 10000)
                {
                    FindNodeResponse response = (FindNodeResponse)args.Response;
                    var ns = Node.FromCompactNode(response.Nodes);
                    foreach (var n in ns)
                    {
                        //Console.WriteLine("Find {1} Node: {0}", n.Id, nodes.Count);
                        lock (find_queue)
                            find_queue.Enqueue(n);
                    }
                }
            }
            else
            {
                nodes.RemoveWhere(n => ((FindNode)args.Query).Target == n.Id);
            }
        }
Beispiel #4
0
        void TaskComplete(object sender, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= TaskComplete;

            // I should raise the event with some eventargs saying which node was dead
            SendQueryEventArgs args = (SendQueryEventArgs)e;
            
            if (args.TimedOut)
            {
                // If the node didn't respond and it's no longer in our bucket,
                // we need to send a ping to the oldest node in the bucket
                // Otherwise if we have a non-responder and it's still there, replace it!
                int index = bucket.Nodes.IndexOf(((SendQueryTask)e.Task).Target);
                if (index < 0)
                {
                    SendPingToOldest();
                }
                else
                {
                    bucket.Nodes[index] = newNode;
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
            else
            {
                SendPingToOldest();
            }
        }
Beispiel #5
0
        private void SentAnnounce(object o, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= SentAnnounce;
            activeAnnounces--;

            if (activeAnnounces == 0)
                RaiseComplete(new TaskCompleteEventArgs(this));
        }
Beispiel #6
0
 /// <summary>
 ///    Call when Random Numbers Task is completed.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="args"></param>
 private void OnTaskComplete(object sender, TaskCompleteEventArgs <int, int> args)
 {
     ResultText.Text      = $"Result = {args.Result}";
     ResultText.Tint      = Color.Green;
     TestButton.Tint      = Color.White;
     TestButton.Text.Text = "Start Task";
     ProgressionText.Text = "Completed.";
 }
Beispiel #7
0
        protected override void RaiseComplete(TaskCompleteEventArgs e)
        {
            if (!Active)
                return;

            Active = false;
            base.RaiseComplete(e);
        }
Beispiel #8
0
        private void GetPeersCompleted(object o, TaskCompleteEventArgs e)
        {
            try
            {
                activeQueries--;
                e.Task.Completed -= GetPeersCompleted;

                SendQueryEventArgs args = (SendQueryEventArgs)e;

                // We want to keep a list of the top (K) closest nodes which have responded
                Node target = ((SendQueryTask)args.Task).Target;
                int  index  = queriedNodes.Values.IndexOf(target);
                if (index >= Bucket.MaxCapacity || args.TimedOut)
                {
                    queriedNodes.RemoveAt(index);
                }

                if (args.TimedOut)
                {
                    return;
                }

                GetPeersResponse response = (GetPeersResponse)args.Response;

                // Ensure that the local Node object has the token. There may/may not be
                // an additional copy in the routing table depending on whether or not
                // it was able to fit into the table.
                target.Token = response.Token;
                if (response.Values != null)
                {
                    // We have actual peers!
                    engine.RaisePeersFound(infoHash, MonoTorrent.Client.Peer.Decode(response.Values));
                }
                else if (response.Nodes != null)
                {
                    if (!Active)
                    {
                        return;
                    }

                    // We got a list of nodes which are closer
                    IEnumerable <Node> newNodes = Node.FromCompactNode(response.Nodes);
                    foreach (Node n in Node.CloserNodes(infoHash, closestNodes, newNodes, Bucket.MaxCapacity))
                    {
                        SendGetPeers(n);
                    }
                }
            }
            finally
            {
                if (activeQueries == 0)
                {
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
        }
Beispiel #9
0
 private static void DownloadCompleted(object sender, TaskCompleteEventArgs <byte[]> e)
 {
     Console.WriteLine("Finished: {0}", e.TaskName);
     foreach (var dataItem in e.Result)
     {
         Console.Write(" " + dataItem);
     }
     Console.WriteLine("");
     Console.WriteLine("--------");
 }
Beispiel #10
0
        private void SentAnnounce(object o, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= SentAnnounce;
            _activeAnnounces--;

            if (_activeAnnounces == 0)
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #11
0
        protected override void RaiseComplete(TaskCompleteEventArgs e)
        {
            if (!Active)
            {
                return;
            }

            Active = false;
            base.RaiseComplete(e);
        }
        private void FindNodeComplete(object sender, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= FindNodeComplete;
            activeRequests--;

            var args = (SendQueryEventArgs) e;
            if (!args.TimedOut)
            {
                var response = (FindNodeResponse) args.Response;
                SendFindNode(Node.FromCompactNode(response.Nodes));
            }

            if (activeRequests == 0)
                RaiseComplete(new TaskCompleteEventArgs(this));
        }
Beispiel #13
0
        private void GetPeersCompleted(object o, TaskCompleteEventArgs e)
        {
            try
            {
                activeQueries--;
                e.Task.Completed -= GetPeersCompleted;

                SendQueryEventArgs args = (SendQueryEventArgs)e;

                // We want to keep a list of the top (K) closest nodes which have responded
                Node target = ((SendQueryTask)args.Task).Target;
                int index = queriedNodes.Values.IndexOf(target);
                if (index >= Bucket.MaxCapacity || args.TimedOut)
                    queriedNodes.RemoveAt(index);

                if (args.TimedOut)
                    return;

                GetPeersResponse response = (GetPeersResponse)args.Response;

                // Ensure that the local Node object has the token. There may/may not be
                // an additional copy in the routing table depending on whether or not
                // it was able to fit into the table.
                target.Token = response.Token;
                if (response.Values != null)
                {
                    // We have actual peers!
                    engine.RaisePeersFound(infoHash, MonoTorrent.Client.Peer.Decode(response.Values));
                }
                else if (response.Nodes != null)
                {
                    if (!Active)
                        return;

                    // We got a list of nodes which are closer
                    IEnumerable<Node> newNodes = Node.FromCompactNode(response.Nodes);
                    foreach (Node n in Node.CloserNodes(infoHash, closestNodes, newNodes, Bucket.MaxCapacity))
                        SendGetPeers(n);
                }
            }
            finally
            {
                if (activeQueries == 0)
                    RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #14
0
        private void GotPeers(object o, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= GotPeers;
            GetPeersTask getpeers = (GetPeersTask)e.Task;
            foreach (Node n in getpeers.ClosestActiveNodes.Values)
            {
                if (n.Token == null)
                    continue;
                AnnouncePeer query = new AnnouncePeer(engine.LocalId, infoHash, port, n.Token);
                SendQueryTask task = new SendQueryTask(engine, query, n);
                task.Completed += SentAnnounce;
                task.Execute();
                activeAnnounces++;
            }

            if (activeAnnounces == 0)
                RaiseComplete(new TaskCompleteEventArgs(this));
        }
        private void FindNodeComplete(object sender, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= FindNodeComplete;
            activeRequests--;

            SendQueryEventArgs args = (SendQueryEventArgs)e;

            if (!args.TimedOut)
            {
                FindNodeResponse response = (FindNodeResponse)args.Response;
                SendFindNode(Node.FromCompactNode(response.Nodes));
            }

            if (activeRequests == 0)
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
        protected override void RaiseComplete(TaskCompleteEventArgs e)
        {
            if (!Active)
                return;

            // If we were given a list of initial nodes and they were all dead,
            // initialise again except use the utorrent router.
            if (initialNodes.Count > 0 && engine.RoutingTable.CountNodes() < 10)
            {
                new InitialiseTask(engine).Execute();
            }
            else
            {
                engine.RaiseStateChanged(DhtState.Ready);
            }

            Active = false;
            base.RaiseComplete(e);
        }
        private void TaskComplete(object sender, TaskCompleteEventArgs eventArgs)
        {
            _task.Completed -= TaskComplete;

            var sendQueryEventArgs = (SendQueryEventArgs) eventArgs;
            if (sendQueryEventArgs.TimedOut)
            {
                _bucket.SortBySeen();
                var index = _bucket.Nodes.IndexOf(_node);

                if (index == -1 || (++index < _bucket.Nodes.Count))
                    QueryNode(_bucket.Nodes[0]);
                else
                    RaiseComplete(new TaskCompleteEventArgs(this));
            }
            else
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #18
0
        private void GotPeers(object o, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= GotPeers;
            var getpeers = (GetPeersTask)e.Task;

            foreach (var task in from n in getpeers.ClosestActiveNodes.Values
                     where n.Token != null
                     let query = new AnnouncePeer(_engine.LocalId, _infoHash, _port, n.Token)
                                 select new SendQueryTask(_engine, query, n))
            {
                task.Completed += SentAnnounce;
                task.Execute();
                _activeAnnounces++;
            }

            if (_activeAnnounces == 0)
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
        protected override void RaiseComplete(TaskCompleteEventArgs e)
        {
            if (!Active)
            {
                return;
            }

            // If we were given a list of initial nodes and they were all dead,
            // initialise again except use the utorrent router.
            if (initialNodes.Count > 0 && engine.RoutingTable.CountNodes() < 10)
            {
                new InitialiseTask(engine).Execute();
            }
            else
            {
                engine.RaiseStateChanged(DhtState.Ready);
            }

            Active = false;
            base.RaiseComplete(e);
        }
        private void TaskComplete(object o, TaskCompleteEventArgs e)
        {
            task.Completed -= TaskComplete;

            SendQueryEventArgs args = (SendQueryEventArgs)e;
            if (args.TimedOut)
            {
                bucket.SortBySeen();
                int index = bucket.Nodes.IndexOf(node);
                if (index == -1 || (++index < bucket.Nodes.Count))
                {
                    QueryNode(bucket.Nodes[0]);
                }
                else
                {
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
            else
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #21
0
        private void GotPeers(object o, TaskCompleteEventArgs e)
        {
            e.Task.Completed -= GotPeers;
            GetPeersTask getpeers = (GetPeersTask)e.Task;

            foreach (Node n in getpeers.ClosestActiveNodes.Values)
            {
                if (n.Token == null)
                {
                    continue;
                }
                AnnouncePeer  query = new AnnouncePeer(_engine.LocalId, _infoHash, _port, n.Token);
                SendQueryTask task  = new SendQueryTask(_engine, query, n);
                task.Completed += SentAnnounce;
                task.Execute();
                _activeAnnounces++;
            }

            if (_activeAnnounces == 0)
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #22
0
        private void TaskComplete(object o, TaskCompleteEventArgs e)
        {
            _task.Completed -= TaskComplete;

            SendQueryEventArgs args = (SendQueryEventArgs)e;

            if (args.TimedOut)
            {
                _bucket.SortBySeen();
                int index = _bucket.Nodes.IndexOf(_node);
                if ((index == -1) || (++index < _bucket.Nodes.Count))
                {
                    QueryNode(_bucket.Nodes[0]);
                }
                else
                {
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
            else
            {
                RaiseComplete(new TaskCompleteEventArgs(this));
            }
        }
Beispiel #23
0
 protected override void RaiseComplete(TaskCompleteEventArgs e)
 {
     _engine.MessageLoop.QuerySent -= MessageSent;
     e.Task = this;
     base.RaiseComplete(e);
 }
 protected override void RaiseComplete(TaskCompleteEventArgs e)
 {
     Unhook();
     e.Task = this;
     base.RaiseComplete(e);
 }
Beispiel #25
0
 protected override void RaiseComplete(TaskCompleteEventArgs e)
 {
     Unhook();
     e.Task = this;
     base.RaiseComplete(e);
 }
Beispiel #26
0
 protected virtual void RaiseComplete(TaskCompleteEventArgs e)
 {
     Completed?.Invoke(this, e);
 }
Beispiel #27
0
 protected virtual void RaiseComplete(TaskCompleteEventArgs e)
 {
     EventHandler<TaskCompleteEventArgs> h = Completed;
     if (h != null)
         h(this, e);
 }
Beispiel #28
0
        private void GetPeersCompleted(object o, TaskCompleteEventArgs e)
        {
            try
            {
                _activeQueries--;
                e.Task.Completed -= GetPeersCompleted;

                var args = (SendQueryEventArgs)e;

                // We want to keep a list of the top (K) closest nodes which have responded
                var target = ((SendQueryTask)args.Task).Target;

                //var index = ClosestActiveNodes.Values.IndexOf(target);

                var key   = target.Id.Xor(_infoHash);
                int index = 0;
                foreach (var obj3 in this.ClosestActiveNodes.Keys)
                {
                    if (!(obj3 == key))
                    {
                        ++index;
                    }
                    else
                    {
                        break;
                    }
                }

                if (index >= Bucket.MaxCapacity || args.TimedOut)
                {
                    ClosestActiveNodes.RemoveAt(index);
                }

                if (args.TimedOut)
                {
                    return;
                }

                var response = (GetPeersResponse)args.Response;

                // Ensure that the local Node object has the token. There may/may not be
                // an additional copy in the routing table depending on whether or not
                // it was able to fit into the table.
                target.Token = response.Token;
                if (response.Values != null)
                {
                    // We have actual peers!
                    Debug.WriteLine("Found peers");
                    _engine.RaisePeersFound(_infoHash, Peer.Decode(response.Values));
                }
                else if (response.Nodes != null)
                {
                    if (!Active)
                    {
                        return;
                    }
                    // We got a list of nodes which are closer
                    var newNodes = Node.FromCompactNode(response.Nodes);
                    foreach (var n in Node.CloserNodes(_infoHash, _closestNodes, newNodes, Bucket.MaxCapacity))
                    {
                        SendGetPeers(n);
                    }
                }
            }
            finally
            {
                if (_activeQueries == 0)
                {
                    RaiseComplete(new TaskCompleteEventArgs(this));
                }
            }
        }