示例#1
0
        /// <summary>
        /// Adds data on a remote peer. The main difference to PUT is that it will convert the data collection to a map.
        /// The key for the map will be the SHA-1 hash of the data.
        /// </summary>
        /// <param name="remotePeer">The remote peer on which to store the data.</param>
        /// <param name="addBuilder">The builder to use for this operation.</param>
        /// <param name="channelCreator">The channel creator that will be used.</param>
        /// <returns>The future response message.</returns>
        public Task <Message> AddAsync(PeerAddress remotePeer, AddBuilder addBuilder, ChannelCreator channelCreator)
        {
            Utils.NullCheck(remotePeer, addBuilder.LocationKey, addBuilder.DomainKey);

            Message.MessageType type;
            if (addBuilder.IsProtectDomain)
            {
                type = addBuilder.IsList ? Message.MessageType.Request4 : Message.MessageType.Request2;
            }
            else
            {
                type = addBuilder.IsList ? Message.MessageType.Request3 : Message.MessageType.Request1;
            }

            // convert the data
            var dataMap = new SortedDictionary <Number160, Data>();

            if (addBuilder.DataSet != null)
            {
                foreach (var data in addBuilder.DataSet)
                {
                    if (addBuilder.IsList)
                    {
                        Number160 hash;
                        do
                        {
                            hash = new Number160(addBuilder.Random);
                        } while (dataMap.ContainsKey(hash));
                        dataMap.Add(hash, data);
                    }
                    else
                    {
                        dataMap.Add(data.Hash, data);
                    }
                }
            }

            var message = CreateRequestMessage(remotePeer, Rpc.Commands.Add.GetNr(), type);

            if (addBuilder.IsSign)
            {
                message.SetPublicKeyAndSign(addBuilder.KeyPair);
            }

            message.SetDataMap(new DataMap(addBuilder.LocationKey, addBuilder.DomainKey, addBuilder.VersionKey, dataMap));

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

            if (!addBuilder.IsForceUdp)
            {
                return(requestHandler.SendTcpAsync(channelCreator));
            }
            return(requestHandler.SendUdpAsync(channelCreator));
        }
 public TcsPut Add(AddBuilder builder)
 {
     throw new NotImplementedException();
 }