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(); }
private void AddShareNode(NodeShareInfo snode) { lock (sharedPCs) { if (sharedPCs.FirstOrDefault(x => ((x.NodeId == snode.NodeId) && (x.PCId == snode.PCId))) != null) {//already in sharedPCs return; } else { sharedPCs.Add(snode); } } }
internal void OnNodeAdded(NodeShareInfo ninfo, string nodename, long pctimeStamp) { var newinf = new NodeInfoForPC { NodeGuid = ninfo.NodeId, PCVersion = ninfo.PCVersion, PCTimeStamp = pctimeStamp, Url = ninfo.Url, Name = nodename }; lock (CachedNodes) { CachedNodes.Add(newinf); } OnCachedNodesChange(); }
private async Task OnNewNodeDiscovered(NodeInfo node, HttpResponseMessage req) { var res = JsonConvert.DeserializeObject <List <SSDPPCInfo> >(await req.Content.ReadAsStringAsync().ConfigureAwait(false)); if (res == null) { res = new List <SSDPPCInfo>(); } var pcs = PersonalClouds; foreach (var pc in pcs) { await pc.OnNodeUpdate(node, res).ConfigureAwait(false); //logger.LogTrace($"{ServerPort}:OnNodeUpdate {pc.NodeDisplayName}"); } if (res?.Count > 0) { foreach (var item in res) { var pc = pcs.Where(x => x.Id == item.Id).FirstOrDefault(); if ((pc == null) && (!string.IsNullOrWhiteSpace(item.CodeHash))) { var hash = ulong.Parse(item.CodeHash, CultureInfo.InvariantCulture); var snode = new NodeShareInfo { Hash = hash, NodeId = node.NodeGuid, Url = node.Url, PCId = item.Id, PCVersion = node.PCVersion, }; AddShareNode(snode); logger.LogTrace($"{ServerPort}:A PC is sharing"); } else { RemoveSharedNode(node, item.Id); } } } else { RemoveSharedNode(node); } }