/// <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(); }