public async Task <PersonalCloud> JoinPersonalCloud(int code, string nodedisplayname) { byte[] data = Encoding.UTF8.GetBytes(code.ToString(CultureInfo.InvariantCulture)); ulong hcode = xxHash64.ComputeHash(data, data.Length); NodeShareInfo spc = null; lock (sharedPCs) { spc = sharedPCs.FirstOrDefault(x => x.Hash == hcode); } if (spc != null) { var ts = DateTime.UtcNow.ToFileTime(); data = BitConverter.GetBytes(ts + code); var newhcode = xxHash64.ComputeHash(data, data.Length); var pcresp = await httpclient.GetAsync(new Uri(new Uri(spc.Url), $"clouds/{spc.PCId}?ts={ts}&hash={newhcode}")).ConfigureAwait(false); if (pcresp.IsSuccessStatusCode) { var str = await pcresp.Content.ReadAsStringAsync().ConfigureAwait(false); //todo: add response check(hash check). var pci = JsonConvert.DeserializeObject <PersonalCloudInfo>(str); if ((pci == null) || (pci.DisplayName == null)) { throw new InviteNotAcceptedException(); } var l = loggerFactory.CreateLogger("PersonalCloud"); var pc = pci.ToPersonalCloud(l, this); pc.NodeDisplayName = nodedisplayname; pc.OnNodeAdded(spc, pci.NodeDisplayName, pci.TimeStamp); lock (_PersonalClouds) { _PersonalClouds.Add(pc); } SavePCList(); lock (KnownNodes) { KnownNodes.Clear(); } await nodeDiscovery.RePublish(NodeId, ServerPort).ConfigureAwait(false); nodeDiscovery.StartSearch(); logger.LogDebug($"Join {pc.DisplayName}"); return(pc); } throw new InvalidDeviceResponseException(); } throw new NoDeviceResponseException(); }