Exemple #1
0
        public Task <Message> DigestAsync(PeerAddress remotePeer, DigestBuilder digestBuilder,
                                          ChannelCreator channelCreator)
        {
            sbyte command;

            if (digestBuilder.IsReturnBloomFilter)
            {
                command = Rpc.Commands.DigestBloomfilter.GetNr();
            }
            else if (digestBuilder.IsReturnMetaValues)
            {
                command = Rpc.Commands.DigestMetaValues.GetNr();
            }
            else if (digestBuilder.IsReturnAllBloomFilter)
            {
                command = Rpc.Commands.DigestAllBloomfilter.GetNr();
            }
            else
            {
                command = Rpc.Commands.Digest.GetNr();
            }

            Message.MessageType type;
            if (digestBuilder.IsAscending && digestBuilder.IsBloomFilterAnd)
            {
                type = Message.MessageType.Request1;
            }
            else if (!digestBuilder.IsAscending && digestBuilder.IsBloomFilterAnd)
            {
                type = Message.MessageType.Request2;
            }
            else if (!digestBuilder.IsAscending && !digestBuilder.IsBloomFilterAnd)
            {
                type = Message.MessageType.Request3;
            }
            else
            {
                type = Message.MessageType.Request4;
            }

            var message = CreateRequestMessage(remotePeer, command, type);

            if (digestBuilder.IsSign)
            {
                message.SetPublicKeyAndSign(digestBuilder.KeyPair);
            }
            if (digestBuilder.IsRange)
            {
                var keys = new List <Number640>(2);
                keys.Add(digestBuilder.From);
                keys.Add(digestBuilder.To);
                message.SetIntValue(digestBuilder.ReturnNr);
                message.SetKeyCollection(new KeyCollection(keys));
            }
            else if (digestBuilder.Keys == null)
            {
                if (digestBuilder.LocationKey == null || digestBuilder.DomainKey == null)
                {
                    throw new ArgumentException("Null not allowed in location or domain.");
                }
                message.SetKey(digestBuilder.LocationKey);
                message.SetKey(digestBuilder.DomainKey);

                if (digestBuilder.ContentKeys != null)
                {
                    message.SetKeyCollection(new KeyCollection(digestBuilder.LocationKey, digestBuilder.DomainKey,
                                                               digestBuilder.VersionKey, digestBuilder.ContentKeys));
                }
                else
                {
                    message.SetIntValue(digestBuilder.ReturnNr);
                    if (digestBuilder.KeyBloomFilter != null || digestBuilder.ContentBloomFilter != null)
                    {
                        if (digestBuilder.KeyBloomFilter != null)
                        {
                            message.SetBloomFilter(digestBuilder.KeyBloomFilter);
                        }
                        if (digestBuilder.ContentBloomFilter != null)
                        {
                            message.SetBloomFilter(digestBuilder.ContentBloomFilter);
                        }
                    }
                }
            }
            else
            {
                message.SetKeyCollection(new KeyCollection(digestBuilder.Keys));
            }

            var tcsResponse    = new TaskCompletionSource <Message>(message);
            var requestHandler = new RequestHandler(tcsResponse, PeerBean, ConnectionBean, digestBuilder);

            if (!digestBuilder.IsForceUdp)
            {
                return(requestHandler.SendTcpAsync(channelCreator));
            }
            return(requestHandler.SendUdpAsync(channelCreator));
        }
 public TcsDigest Digest(DigestBuilder builder)
 {
     throw new NotImplementedException();
 }