Example #1
0
        public void ShouldTriggerBlockSent()
        {
            using (DataShareFixture fixture = new DataShareFixture())
                using (DataShareSession session = fixture.Start())
                {
                    BlockRequested requested = new BlockRequested
                    {
                        Hash  = session.Service.Hash,
                        Peer  = PeerHash.Random(),
                        Block = new BlockIndex(1, 0, 3616)
                    };

                    BlockRead read = new BlockRead
                    {
                        Hash    = session.Service.Hash,
                        Block   = requested.Block,
                        Payload = new DataShareBlock(3616)
                    };

                    Trigger handler = Trigger.Bind(ref session.Service.Hooks.OnBlockSent, data =>
                    {
                        data.Hash.Should().Be(session.Service.Hash);
                        data.Peer.Should().Be(requested.Peer);
                        data.Block.Should().Be(requested.Block);
                        data.Block.Size.Should().Be(3616);
                    });

                    session.Service.Start();
                    session.Service.Handle(requested);

                    session.Service.Handle(read);
                    session.Pipeline.Process();

                    handler.Wait().Should().BeTrue();
                }
        }
Example #2
0
        public void Handle(BlockRead data)
        {
            context.Queue.Add(() =>
            {
                IList <DataShareEntry> entries = context.Collection.RemoveAll(data.Block);
                DataBlock payload = data.Payload.Shared(entries.Count);

                for (int i = 1; i < entries.Count; i++)
                {
                    context.Dependencies.Glue.SendPiece(entries[i].Peer, data.Block, payload);
                    context.Hooks.CallBlockSent(context.Parameters.Hash, entries[i].Peer, data.Block);
                }

                if (entries.Count > 0)
                {
                    context.Dependencies.Glue.SendPiece(entries[0].Peer, data.Block, payload);
                    context.Hooks.CallBlockSent(context.Parameters.Hash, entries[0].Peer, data.Block);
                }
                else
                {
                    data.Payload.Release();
                }
            });
        }